如何在内存中压缩文件并上传至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
相关产品推荐
相关产品推荐

