【问题标题】:How to upload in-memory zip file to S3-bucket如何将内存中的 zip 文件上传到 S3-bucket
【发布时间】:2019-02-05 05:06:57
【问题描述】:

我正在尝试将内存中的 zip 文件上传到 S3 存储桶(以避免在我的服务器上出现临时文件)。

这是我的代码:

import zipfile
import io
zip_bytes_io = io.BytesIO()
zip_archive = zipfile.ZipFile(zip_bytes_io, mode='a',
                              compression=zipfile.ZIP_DEFLATED)
zip_archive.writestr('test.txt', b'My string')
s3_client = boto3.client('s3')
zip_bytes_io.seek(0)  # So that bytes are read from beginning
s3_client.upload_fileobj(zip_bytes_io, test_bucket, 'test.zip')

当我运行上述代码时,它会将文件上传到 S3 存储桶。但是,当我下载文件时,我无法解压缩它。我收到错误消息:“错误 1 ​​- 不允许操作。”

我认为这是因为我一开始就没有正确上传文件。任何帮助表示赞赏:)

【问题讨论】:

  • 不确定是否有其他错误来源,但您上传的存档不完整。在完成writestr()(并且您的存档已完成)之后,您必须首先zip_archive.close()。您可以在zip_bytes_io 上尝试tell() 以查看close() 前后的差异。
  • @OndrejK。我认为:s3_client.upload_fileobj(zip_bytes_io, test_bucket, 'test.zip') 默认关闭文件?如果我添加行zip_archive.close() 则抛出异常{ValueError}I/O operation on closed file.
  • 看起来zip_archive.close() 实际上也关闭了zip_bytes_io,但这不是我可以重现的行为。您能否展示最近失败的完整回溯?但如前所述,这只是我想到的。它可能根本不相关。
  • 是否可以将 zip 文件写入临时文件,然后使用 upload_file 将其上传——在关闭文件之前发送 tempfileobj.name 作为文件名?

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


【解决方案1】:

在线查找Error 1 - operation not permitted. 错误时,看起来可能是Mac-os 打开压缩文件问题?

尝试以不同的方式打开文件?

【讨论】:

猜你喜欢
  • 2023-03-17
  • 2023-01-03
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2012-09-18
  • 2020-01-18
相关资源
最近更新 更多