首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带Content MD5验证的boto3 s3上传大文件

带Content MD5验证的boto3 s3上传大文件
EN

Stack Overflow用户
提问于 2019-09-19 16:56:13
回答 1查看 2.4K关注 0票数 2

我在上传大文件时遇到问题,为了提供传输验证,我找到了一个可用的ContentMD5方法

我从client.upload_file开始。此方法没有ContentMD5参数。因此,我尝试使用一个函数为该文件生成一个本地ETag,并用传输的文件验证它。

我发现如果您在S3存储桶中使用KMS加密,则您的etag以某种方式依赖于KMS,并且本地生成的ETag不等于S3中的ETag。

第二次尝试是使用Object.put。在这里,你可以使用ContentMD5,KMS也可以工作,但是函数使用单个流来上传,而不是多部分。单流无法上传大文件。

所以现在我有点卡住了。有一个创建MultiPart函数和upload_part,但我找不到任何使用ContentMD5作为整体的示例。

这就是Object.put的尝试

代码语言:javascript
运行
复制
binary_hash = hashlib.md5(open(file_name,'rb').read()).digest()
file_md5 = base64.b64encode(binary_hash)

metadata = {
    "md5sum": file_md5
}

try:
    obj = s3_resource.Object(bucket, fileobj)
    obj.put(
        Body=open(file_name, 'rb'),
        ContentMD5=file_md5,
        Metadata=metadata,
        ServerSideEncryption='aws:kms',
        SSEKMSKeyId=s3kmskey)
EN

回答 1

Stack Overflow用户

发布于 2019-09-19 17:32:59

Multipart uploads将文件拆分成块。因此,您需要计算每个块的MD5校验和,然后连接所有校验和的校验和。ETag将是上述拼接的校验和,后跟-n,其中n是部分的数量。这在官方文档中是不可用的。

This python script can do the work for you.

注意:作为documentation suggests,这不适用于KMS加密。

You can alternatively calculate the MD5 hash and pass it along the request with Content-MD5 header.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58007294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档