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.
上的 GET
或 HEAD
请求的响应中
另请注意,这仅适用于正常的 PUT
操作。 Multi-part 上传完全是另一回事。
我可能有这个错误,但我的印象是,当我使用 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.
GET
或 HEAD
请求的响应中
另请注意,这仅适用于正常的 PUT
操作。 Multi-part 上传完全是另一回事。