Boto S3 Key MD5属性未与密钥一起存储

时间:2015-02-03 07:06:03

标签: python amazon-s3 boto

我可能有这个错误,但我的印象是,当我使用set_contents_from_filename方法时,应自动计算文件的MD5哈希并将其作为元数据存储在密钥中。因此,在比较文件以进行可能的覆盖时,只需要下载密钥的MD5属性以与本地文件的散列进行比较。但是,即使我可以成功上传文件作为键,键的MD5属性也始终为None。为什么?请参阅下面的代码示例。

from boto.s3.connection import S3Connection
from boto.s3.key import Key

key = 'xxxx'
secret = 'xxxx'
connection = S3Connection(key, secret)
bucket = connection.get_bucket('xxxx')

# create a file and push it to S3
f = open('test_file.txt', 'rwb')
f.write('this is a test')
k = Key(bucket)
k.key = 'test_key'
k.set_contents_from_file(f)
# check MD5
k.md5
>>> 'd41d8cd98f00b204e9800998ecf8427e'

# get same key from S3
k = bucket.get_key('test_key')
# check MD5
k.md5
>>>  # None

1 个答案:

答案 0 :(得分:2)

排序答案是您应该检查k.etag而不是k.md5

更长的答案是,上传文件时boto所做的是它计算该文件的MD5校验和,并向发送给S3的Content-MD5请求添加PUT标头。然后,S3计算它接收的文件的MD5,并将其与Content-MD5标头的值进行比较。如果它们不匹配,则返回400 BadDigest错误。如果匹配,则会返回200 OK响应,并在响应中包含ETag标头。此etag值应与MD5校验和和boto检查相同,返回值以确保它与计算的MD5校验和相匹配。

因此,boto会进行相当彻底的端到端完整性检查,但如果您想自行检查,请在对ETag的响应中或在对{a}的响应中查找PUT标头<{1}}或GET请求对象。

另请注意,这仅适用于正常的HEAD操作。多部分上传完全是一个不同的野兽。