python - 分段上传的 s3 文件返回不正确的 etag
问题描述
我有一个 py 函数,它执行分段上传,其中块大小(max_file_size_MB)设置为1MB:
def upload_file_to_aws(self, file_path, filename):
MB = 1024 ** 2
config = TransferConfig(multipart_threshold=self.max_file_size_MB * MB, max_concurrency=10,
multipart_chunksize=self.max_file_size_MB * MB, use_threads=True)
try:
self.client.upload_file(file_path, self.bucket_name, filename,
ExtraArgs={'ContentType': 'application/json'},
Config=config,
Callback=ProgressPercentage(file_path))
except ClientError as e:
logging.error("Error uploading file to AWS. %s", e)
return False
我正在使用here的etag计算算法
我有以下单元测试以确保使用1.6MB文件的 etag calc 函数工作正常
@mock_s3
def test_calculated_s3_etag_for_multipart_uploads_is_correct(self):
# Run on a file of 1.6MB
conn = boto3.resource('s3')
conn.create_bucket(Bucket=self.client.bucket_name)
calculated_etag = calculate_s3_etag(SNAPSHOT_DATA_LARGE_FILE)
self.client.upload_file_to_aws(SNAPSHOT_DATA_LARGE_FILE, METADATA_ID)
obj = self.client.get_object(self.client.bucket_name, METADATA_ID)
uploaded_file_etag = obj['ETag']
assert calculated_etag == uploaded_file_etag
但它失败了assert '"bd86ed92459190f807e59b60b6089674-2"' == u'"eaa8602b7154cab4e0787756b2fdc53f-1"'
计算出的 etag 看起来不错,但我不确定为什么 S3 etag 看起来只上传了 1 个块(本来应该是 2 个)
有什么想法我可能做错了吗?
编辑:因此,只要块大小超过5MB ,上述所有文件都可以正常工作。如果我想以小于 5MB 的块传输文件,我不确定使用的是什么编码技术(我不能使用解码的 md5 或反向工程 etag 解码)