【发布时间】: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