【发布时间】:2014-12-10 00:32:11
【问题描述】:
在boto/s3 模块中有一个名为set_contents_from_filename 的函数,它似乎将md5 哈希作为参数。
但文档并不清楚何时/如何计算哈希值。有人可以帮我解决这个问题吗?另外,如何将哈希信息保存到文件中?
【问题讨论】:
在boto/s3 模块中有一个名为set_contents_from_filename 的函数,它似乎将md5 哈希作为参数。
但文档并不清楚何时/如何计算哈希值。有人可以帮我解决这个问题吗?另外,如何将哈希信息保存到文件中?
【问题讨论】:
set_contents_from_filename 方法会自动为您计算 MD5 校验和。此方法有一个可选的md5 参数,如果您已经在应用程序中出于某种原因计算了 MD5,则可以传入该参数,但如果您没有传入值,boto 将为您计算它。
【讨论】:
正如@garnatt 已经说过的,set_contents_from_filename 方法会自动为您计算 MD5 校验和。
如果您查看文档,有一个名为 compute_md5 的方法返回一个元组,该元组包含十六进制摘要中的 MD5 校验和(您使用 md5sum 在控制台中获得的内容)以及它发送到亚马逊的 base64 编码这就是您在标题中看到的内容。
set_contents_from_filename 方法中的md5 参数采用元组格式的MD5 校验和,与compute_md5 返回的方式相同。如果需要手动计算,最好的方法是使用compute_md5方法。否则,您必须在将元组传递给md5 参数之前以正确的格式构建元组。
【讨论】:
boto计算的MD5是校验和的base 64编码。要上传/已上传的给定文件的标头中的“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())
【讨论】: