如何解决分段上传的 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 解码)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。