You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在内存中压缩文件并上传至Amazon S3,解决压缩包无效问题

原因分析
  • 核心问题出在ZipFile的初始化模式选择错误:你使用了"a"(追加)模式创建压缩包,该模式仅适用于向已存在的有效Zip文件中新增内容。当你向空的BytesIO流中新建压缩包时,追加模式会导致ZipFile在关闭时无法正确写入压缩包必备的中央目录、结束标记等核心元数据。
  • 本地的解压工具通常容错性较强,会自动补全部分缺失的元数据,因此本地保存的压缩包可以正常打开;但S3存储不会修改文件内容,上传后的压缩包本身元数据缺失,所以无法正常解压。
修复方案

ZipFile初始化时将模式从"a"替换为"w"(写入模式,用于创建全新的压缩包)即可,调整后的代码如下:

s3_client = boto3.client("s3")
zip_buffer = io.BytesIO()
# 仅修改模式参数为w
with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED, False) as zipper:
     for file in bunch:
         zipper.write(file)
s3_client.put_object(Bucket=S3_BUCKET, Key=ZIP_NAME_IN_S3_BUCKET, Body=zip_buffer.getvalue())
zip_buffer.close()

如果后续调整代码时直接传递zip_buffer对象作为Body参数,需要在with块结束后补充zip_buffer.seek(0)重置流指针到起始位置,避免读取内容为空。

内容的提问来源于stack exchange,提问作者smallbirds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:18:00