使用散列验证分段上传到 S3
Multipart upload to S3 with hash verification
我正在寻找一个命令行工具或一个 Python 库,它允许将大文件上传到 S3,并进行哈希验证。
有一个 AWS article 解释了如何通过提供 content-md5
header 来自动完成它。
然而,尚不清楚哪些命令行工具可以或不可以这样做:
rclone 的文档指出
files uploaded with multipart upload don’t have an MD5SUM.
s3cmd 对此没有说明,但它支持同步功能的 md5
s4cmd手册里有一整段,但还不清楚上传是否真的验证过
boto3 / s3transfer 的 upload_file()
方法什么都没说
您是否有关于这些工具或其他工具或 Python 库或 boto3 片段的信息,这些工具可以处理大文件上传到 s3 并具有 rsync 的可靠性?
为什么不使用 aws cli?它支持 md5 验证,即使是分段上传。参见 this。 s3api的upload-part和put-object命令都支持使用hash进行内容验证。
并且 s4cmd 确实使用包含 md5 的自定义内容 header 验证上传。
S4cmd doc中提到的Etag计算,参见this。
在询问了官方aws cli
(boto3)工具的作者后,我得出的结论是aws cli
always 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 方法
我正在寻找一个命令行工具或一个 Python 库,它允许将大文件上传到 S3,并进行哈希验证。
有一个 AWS article 解释了如何通过提供 content-md5
header 来自动完成它。
然而,尚不清楚哪些命令行工具可以或不可以这样做:
rclone 的文档指出
files uploaded with multipart upload don’t have an MD5SUM.
s3cmd 对此没有说明,但它支持同步功能的 md5
s4cmd手册里有一整段,但还不清楚上传是否真的验证过
boto3 / s3transfer 的
upload_file()
方法什么都没说
您是否有关于这些工具或其他工具或 Python 库或 boto3 片段的信息,这些工具可以处理大文件上传到 s3 并具有 rsync 的可靠性?
为什么不使用 aws cli?它支持 md5 验证,即使是分段上传。参见 this。 s3api的upload-part和put-object命令都支持使用hash进行内容验证。
并且 s4cmd 确实使用包含 md5 的自定义内容 header 验证上传。
S4cmd doc中提到的Etag计算,参见this。
在询问了官方aws cli
(boto3)工具的作者后,我得出的结论是aws cli
always 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 方法