使用哈希验证将分段上传到S3

时间:2017-05-05 00:49:29

标签: amazon-s3 boto boto3 s3cmd

我正在寻找一个命令行工具或Python库,它允许使用哈希验证将大文件上传到S3。

AWS article解释如何通过提供content-md5标题自动完成。

然而,目前尚不清楚哪些命令行工具执行或不执行此操作:

  • rclone的文档说明了

      

    使用分段上传文件上传的文件没有MD5SUM。

  • s3cmd对此没有任何说明,但它支持md5用于同步功能

  • s4cmd在手册中有一整段,但目前仍不清楚是否实际验证了上传

  • boto3 / s3transfer的upload_file()方法并没有真正说什么

您是否有关于这些工具或其他工具或Python库或boto3代码段的信息,它们以rsync的可靠性处理大文件上传到s3?

3 个答案:

答案 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))