内存中的 zip 文件上传一个 0 B 对象

Posted

技术标签:

【中文标题】内存中的 zip 文件上传一个 0 B 对象【英文标题】:In-memory zip file uploads a 0 B object 【发布时间】:2017-10-12 10:21:00 【问题描述】:

我正在创建一个内存中的 zip 文件并将其上传到 S3,如下所示:

def upload_script(s3_key, file_name, script_code):
    """Upload the provided script code onto S3, and return the key of uploaded object"""
    bucket = boto3.resource('s3').Bucket(config.AWS_S3_BUCKET)
    zip_file = BytesIO()
    zip_buffer = ZipFile(zip_file, "w", ZIP_DEFLATED)
    zip_buffer.debug = 3
    zip_buffer.writestr(".py".format(file_name), script_code)
    for zfile in zip_buffer.filelist:
        zfile.create_system = 0
    zip_buffer.close()
    upload_key = "/_.zip".format(s3_key, file_name, TODAY())
    print zip_buffer.namelist(), upload_key
    bucket.upload_fileobj(zip_file, upload_key)
    return upload_key

试运行的打印和返回值如下:

['s_o_me.py'] a/b/s_o_me_20171012.zip
a/b/s_o_me_20171012.zip

测试脚本是一个简单的python行:

print upload_script('a/b', 's_o_me', "import xyz")

文件正在 S3 存储桶中创建,但它们的大小为 0 B。为什么缓冲区没有正确写入/上传?

【问题讨论】:

【参考方案1】:

显然,在继续进行进一步操作之前,您必须返回到 BytesIO 对象中的第 0 个索引。

将 sn-p 更改为:

zip_file.seek(0)
bucket.upload_fileobj(zip_file, upload_key)

完美运行。

【讨论】:

以上是关于内存中的 zip 文件上传一个 0 B 对象的主要内容,如果未能解决你的问题,请参考以下文章

java如何解压页面上传到服务器的zip文件

python gzip文件在内存中并上传到s3

在 AFNetwoking 3.0 中上传 Zip 文件

更新 S3 上 zip 文件夹中的文件

使用 Java 在 S3 中更新 zip 文件

c# 在内存打包zip 多个文件 上传服务器 MemoryStream ZipArchiveMode