我需要将更大的文件上传到AWS Glacier的valut。由于尺寸我无法在一个请求中执行,因此我需要将其拆分为较小的部分并使用分段上传。
Boto3是否包含一个获取大文件的方法,拆分并逐个上传它的部分? 正如我所看到的,Java客户端有这样的方法(取自AWS文档):
高级API提供了一种可用于上传任意大小的归档的方法。根据要上载的文件,该方法可以在单个操作中上载存档,也可以使用Amazon Glacier中的分段上传支持来部分存档存档。
我试过用:
boto3.client(...).upload_archive(...)
但是没有拆分文件而我收到错误。
如果没有实现所有这些低级别的东西(拆分文件,发送多个请求,完成上传......),还有其他方法吗?
答案 0 :(得分:1)
也许这就是你要找的东西? https://boto3.readthedocs.io/en/latest/reference/services/glacier.html#Glacier.Client.upload_multipart_part
我会从文档中添加一些相关信息。
<强> upload_multipart_part(** kwargs)强>
此操作会上传档案的一部分。您可以按任何顺序上传档案部件。您也可以并行上传它们。对于分段上传,您最多可以上传10,000个零件。
Amazon Glacier拒绝您的上传部分请求(如果有的话) 以下条件属实:
- SHA256树形哈希不匹配确保零件数据不匹配 在传输中损坏,您计算部件的SHA256树形哈希 并将其包含在您的请求中。收到零件数据后,亚马逊 Glacier还计算SHA256树形哈希值。如果这些哈希值没有 匹配,操作失败。
- 零件尺寸与尺寸不符 每个部分除了最后一个必须匹配中指定的大小 相应的InitiateMultipartUpload请求。最后的大小 part必须与指定大小相同或小于指定大小。
- 范围未对齐请求中的字节范围值不对齐 与相应启动器中指定的零件尺寸对齐 请求。例如,如果指定的零件大小为4194304字节(4 MB),然后0到4194303字节(4 MB - 1)和4194304(4 MB)到8388607 (8 MB - 1)是有效的零件范围。但是,如果设置范围值为 2 MB至6 MB,范围与零件尺寸和尺寸不对齐 上传将失败。
这是请求语法
response = client.upload_multipart_part(
vaultName='string',
uploadId='string',
range='string',
body=b'bytes'|file
)
参数说明
accountId (字符串)
AccountId值是拥有保管库的帐户的AWS账户ID。您可以指定AWS账户ID,也可以选择单个' - '(连字符),在这种情况下,Amazon Glacier使用与用于签署请求的凭据关联的AWS账户ID。如果您使用帐户ID,请勿在ID中包含任何连字符(' - ')。
vaultName (字符串) [REQUIRED]
保险库的名称。
uploadId (字符串) [REQUIRED]
分段上传的上传ID。
校验和(字符串)
正在上传的数据的SHA256树形哈希值。
范围(字符串)
标识将在此部件中上载的已组装存档中的字节范围。 Amazon Glacier使用此信息以正确的顺序组装存档。此标头的格式遵循RFC 2616.示例标头是Content-Range:bytes 0-4194303 /*.
body (字节或可搜索文件类对象)
要上传的数据。
答案 1 :(得分:0)
您在寻找的是: https://github.com/tbumi/glacier-upload/blob/develop/main.py
response = glacier.complete_multipart_upload(
vaultName=vault_name, uploadId=upload_id,
archiveSize=str(file_size), checksum=total_tree_hash)
以上是你正在寻找的工作。