gpt4 book ai didi

python - 如何使用 Content-MD5 将对象放入 s3

转载 作者:行者123 更新时间:2023-11-28 18:07:11 28 4
gpt4 key购买 nike

我尝试使用 boto3 将 XML 文件上传到 S3。根据 Amazon 的建议,我想发送数据的 Base64 编码 MD5-128 位摘要 (Content-MD5)。

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Object.put

我的代码:

with open(file, 'rb') as tempfile:
body = tempfile.read()
tempfile.close()

hash_object = hashlib.md5(body)
base64_md5 = base64.encodebytes(hash_object.digest())

response = s3.Object(self.bucket, self.key + file).put(
Body=body.decode(self.encoding),
ACL='private',
Metadata=metadata,
ContentType=self.content_type,
ContentEncoding=self.encoding,
ContentMD5=str(base64_md5)
)

当我尝试这个时,str(base64_md5) 创建一个像 'b'ZpL06Osuws3qFQJ8ktdBOw==\n'' 的字符串

在这种情况下,我收到此错误消息:

调用 PutObject 操作时发生错误 (InvalidDigest):您指定的 Content-MD5 无效。

出于测试目的,我只复制了前面没有“b”的值:“ZpL06Osuws3qFQJ8ktdBOw==\n”

然后我得到这个错误信息:

botocore.exceptions.HTTPClientError:HTTP 客户端引发且未处理的异常: header 值无效 b'hvUe19qHj7rMbwOWVPEv6Q==\n'

谁能帮我如何保存上传文件到 S3?

谢谢,

奥利弗

最佳答案

从@Isaac Fife 的示例开始,将其剥离以识别需要什么和不需要什么,并包括导入等以使其成为完整的 reproducible example :

(您唯一需要做的改变就是使用您自己的存储桶名称)

import base64
import hashlib
import boto3

contents = "hello world!"
md = hashlib.md5(contents.encode('utf-8')).digest()
contents_md5 = base64.b64encode(md).decode('utf-8')

boto3.client('s3').put_object(
Bucket="mybucket",
Key="test",
Body=contents,
ContentMD5=contents_md5
)

学习:首先,您尝试生成的 MD5 看起来不像“上传”返回的那样。我们实际上需要一个 base64 版本,它返回一个 md.hexdigest() 版本。 hex是base16,不是base64。

关于python - 如何使用 Content-MD5 将对象放入 s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52880311/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com