首页 > 解决方案 > 分段上传的 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 解码)

标签: pythonamazon-web-servicesamazon-s3boto3etag

解决方案


推荐阅读