我在上传大文件时遇到问题,为了提供传输验证,我找到了一个可用的ContentMD5方法
我从client.upload_file开始。此方法没有ContentMD5参数。因此,我尝试使用一个函数为该文件生成一个本地ETag,并用传输的文件验证它。
我发现如果您在S3存储桶中使用KMS加密,则您的etag以某种方式依赖于KMS,并且本地生成的ETag不等于S3中的ETag。
第二次尝试是使用Object.put。在这里,你可以使用ContentMD5,KMS也可以工作,但是函数使用单个流来上传,而不是多部分。单流无法上传大文件。
所以现在我有点卡住了。有一个创建MultiPart函数和upload_part,但我找不到任何使用ContentMD5作为整体的示例。
这就是Object.put的尝试
binary_hash = hashlib.md5(open(file_name,'rb').read()).digest()
file_md5 = base64.b64encode(binary_hash)
metadata = {
"md5sum": file_md5
}
try:
obj = s3_resource.Object(bucket, fileobj)
obj.put(
Body=open(file_name, 'rb'),
ContentMD5=file_md5,
Metadata=metadata,
ServerSideEncryption='aws:kms',
SSEKMSKeyId=s3kmskey)
发布于 2019-09-19 17:32:59
Multipart uploads将文件拆分成块。因此,您需要计算每个块的MD5校验和,然后连接所有校验和的校验和。ETag将是上述拼接的校验和,后跟-n
,其中n
是部分的数量。这在官方文档中是不可用的。
This python script can do the work for you.
注意:作为documentation suggests,这不适用于KMS加密。
You can alternatively calculate the MD5 hash and pass it along the request with Content-MD5
header.
https://stackoverflow.com/questions/58007294
复制相似问题