使用散列验证分段上传到 S3

Multipart upload to S3 with hash verification

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

有一个 AWS article 解释了如何通过提供 content-md5 header 来自动完成它。

然而,尚不清楚哪些命令行工具可以或不可以这样做:

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

为什么不使用 aws cli?它支持 md5 验证,即使是分段上传。参见 this。 s3api的upload-partput-object命令都支持使用hash进行内容验证。

并且 s4cmd 确实使用包含 md5 的自定义内容 header 验证上传。

S4cmd doc中提到的Etag计算,参见this

在询问了官方aws cli(boto3)工具的作者后,我得出的结论是aws clialways verifies every upload,包括多部分的。

它逐块进行,使用官方 MD5 ETag 验证单部分上传。此外,您还可以启用 SHA256 验证,仍然是逐块验证。

然而,

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

您可以使用 TransferConfig 设置上传的块大小,然后使用 hyperknot 发布的方法自行重新创建 ETag

from boto3.s3.transfer import TransferConfig
transfer_config = TransferConfig(multipart_chunksize=8*1024*1024)

将 transfer_config 传递给 upload_file 方法