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

Boto S3 Key MD5 property not stored with key

我可能有这个错误,但我的印象是,当我使用 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

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

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

因此,boto 进行了相当彻底的 end-to-end 完整性检查,但如果您想检查自己,请在对 PUT 的响应中查找 ETag header或者在对 object.

上的 GETHEAD 请求的响应中

另请注意,这仅适用于正常的 PUT 操作。 Multi-part 上传完全是另一回事。