【问题标题】:boto3 upload a string to glacier fileboto3 将字符串上传到冰川文件
【发布时间】:2016-03-25 13:47:25
【问题描述】:

我的工作流程有一个从 S3 下载的 tar 文件,然后我可以选择将其上传到冰川保险库。鉴于 S3 存储桶中还有其他文件,我不想使用生命周期管理。我在 boto 下完成了所有这些工作,现在正在慢慢升级到 boto3

我最近发现,我可以下载到一个字符串对象并对其进行操作,而不是下载到磁盘上的文件中,这使得解压缩速度更快,因为我不需要接触磁盘。

s3 = boto3.client('s3')
response = s3.get_object(Bucket=bucket,Key=path)
my_file = tarfile.open(fileobj=(StringIO(response['Body'].read())))
my_file.extractall(path="EXTRACTPATH")

如果我想通过 boto3 上传到冰川,这就是我所拥有的:

glacier = boto3.client('glacier', region_name='MYREGION')
archive = glacier.upload_archive(vaultName='MYVAULT', archiveDescription=filename, body=response['Body'].read())

这让我很着迷:

botocore.exceptions.ClientError: An error occurred (InvalidParameterValueException) when calling the UploadArchive operation: Invalid Content-Length: 0

有什么想法吗?

【问题讨论】:

  • 你是否在读同一个正文两次? StreamingBody 来自套接字的流,因此只能读取一次。
  • 好电话。我存储了来自response['Body'].read() 的结果,然后在两个位置使用它,它似乎可以工作。把它作为一个答案。

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


【解决方案1】:

StreamingBody 是一个不可搜索的流,它直接从套接字读取,所以你只能得到一个read。如果要在多个位置使用它们,则需要保存字节。

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多