如何/何时使用Boto库计算S3上传的md5哈希

1 投票
3 回答
5540 浏览
提问于 2025-04-17 13:14

boto/s3模块中,有一个叫做set_contents_from_filename的函数,它似乎需要一个md5哈希值作为参数。

但是,文档没有明确说明什么时候或者如何计算这个哈希值。有人能帮我解答这个问题吗?另外,我该如何把哈希信息保存到文件里呢?

3 个回答

1

boto计算的MD5值是校验和的Base64编码。对于要上传的文件或已经上传的文件,'Content-MD5'这个头信息可以通过以下方式计算:

import hashlib, base64
conn = S3Connection(access_key, secret_key)
bucket = conn.get_bucket('bucket_name')
#If you want to calculate MD5 of a file already uploaded
obj_key = bucket.get_key('file_name_in_s3')
content = obj_key.get_contents_as_string()
m = hashlib.md5()
m.update(content)
value = m.digest()
remote_md5 = base64.b64encode(value)

#To calculate md5 of a file to be uploaded to S3
cur_md5 = base64.b64encode(hashlib.md5(open('Local/Path/To/File').read()).digest())
3

正如@garnatt所说,set_contents_from_filename这个方法会自动帮你计算MD5校验和。

如果你查看文档,会发现有一个叫compute_md5的方法,它会返回一个包含MD5校验和的元组。这个校验和有两种格式,一种是十六进制的(你在控制台使用md5sum命令时看到的),另一种是经过Base64编码的,这个是发送给亚马逊的,所以你在头部信息中看到的就是这个。

set_contents_from_filename方法中,md5参数需要一个元组格式的MD5校验和,和compute_md5返回的格式是一样的。如果你需要手动计算MD5,最好的方法就是使用compute_md5这个方法。否则,你就得在把它传给md5参数之前,先把元组构建成正确的格式。

3

set_contents_from_filename 这个方法会自动为你计算 MD5 校验和。这个方法还有一个可选的 md5 参数,如果你在应用程序中已经计算过 MD5,可以把它传进去。如果你不传值,boto 会帮你自动计算。

撰写回答