我正在寻找一个命令行工具或Python库,它允许使用哈希验证将大文件上传到S3。
有AWS article解释如何通过提供content-md5
标题自动完成。
然而,目前尚不清楚哪些命令行工具执行或不执行此操作:
rclone的文档说明了
使用分段上传文件上传的文件没有MD5SUM。
s3cmd对此没有任何说明,但它支持md5用于同步功能
s4cmd在手册中有一整段,但目前仍不清楚是否实际验证了上传
boto3 / s3transfer的upload_file()
方法并没有真正说什么
您是否有关于这些工具或其他工具或Python库或boto3代码段的信息,它们以rsync的可靠性处理大文件上传到s3?
答案 0 :(得分:1)
您可以使用TransferConfig设置上传的块大小,然后使用hyperknot发布的方法自己重新创建ETag
from boto3.s3.transfer import TransferConfig
transfer_config = TransferConfig(multipart_chunksize=8*1024*1024)
将transfer_config传递到upload_file方法
答案 1 :(得分:0)
为什么不使用aws cli?它支持md5验证,即使是分段上传也是如此。见this。 s3api的 upload-part 和 put-object 命令都支持使用哈希进行内容验证。
s4cmd确实使用包含md5的自定义内容标题验证上传。
至于S4cmd doc中提到的Etag计算,请参阅this。
答案 2 :(得分:0)
在询问官方aws cli
(boto3)工具的作者后,我可以得出结论aws cli
always verifies every upload,包括多部分工具。
它使用官方MD5 ETag验证进行单件上传,逐块进行。此外,您还可以启用SHA256验证,仍然是chunk-by-chunk。
然而, aws cli
不会验证整个汇编文件。为此,您需要使用一些微小的Python函数,例如:
def calculate_s3_etag(file_path, chunk_size=8 * 1024 * 1024):
md5s = []
with open(file_path, 'rb') as fp:
while True:
data = fp.read(chunk_size)
if not data:
break
md5s.append(hashlib.md5(data))
if len(md5s) == 1:
return '"{}"'.format(md5s[0].hexdigest())
digests = b''.join(m.digest() for m in md5s)
digests_md5 = hashlib.md5(digests)
return '"{}-{}"'.format(digests_md5.hexdigest(), len(md5s))