使用Boto3(Python)向AWS Glacier进行高级多部分上传?

时间:2017-04-10 15:23:11

标签: python amazon-web-services boto3 amazon-glacier

我需要将更大的文件上传到AWS Glacier的valut。由于尺寸我无法在一个请求中执行,因此我需要将其拆分为较小的部分并使用分段上传。

Boto3是否包含一个获取大文件的方法,拆分并逐个上传它的部分? 正如我所看到的,Java客户端有这样的方法(取自AWS文档):

  

高级API提供了一种可用于上传任意大小的归档的方法。根据要上载的文件,该方法可以在单个操作中上载存档,也可以使用Amazon Glacier中的分段上传支持来部分存档存档。

我试过用:

boto3.client(...).upload_archive(...)

但是没有拆分文件而我收到错误。

如果没有实现所有这些低级别的东西(拆分文件,发送多个请求,完成上传......),还有其他方法吗?

2 个答案:

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

以上是你正在寻找的工作。