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

Python操作S3生成的ZIP压缩包提示无效归档问题求助

代码错误点
  • 核心错误:S3上传时机错误
    s3.put_object操作被放在ZipFile的with上下文管理块内部。ZipFile必须在退出with块完成资源关闭后,才会把ZIP归档的结束标识、目录索引等必需元数据全部写入内存缓冲区。在with块内部调用zip_buffer.getvalue()只能拿到不完整的ZIP文件片段,所以打开时会提示归档无效。
  • 逻辑错误:压缩包内文件名设置不合理
    调用zipper.writestr时传入的文件名参数值为FILE.zip,导致压缩包内部存储的JSON文件后缀为zip,不符合业务逻辑,建议修改为对应JSON文件名。
  • 冗余代码
    代码中定义了data_io = BytesIO()但全程未使用,可直接删除。
修复后代码
import boto3
import io
import zipfile
import traceback

def upload_zip_file(event,context):    
    try:
        bucket_name = "s3_bucket"
        bucket_path = "files"
        s3 = boto3.client('s3')
        zip_save_name = "FILE.zip"
        source_json_name = "FILE.json"
        zip_buffer = io.BytesIO()
        # 新建压缩包使用w模式比追加的a模式更稳妥
        with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED, False) as zipper:
            infile_object = s3.get_object(Bucket=bucket_name, Key=f"{bucket_path}/{source_json_name}") 
            infile_content = infile_object['Body'].read()
            # 压缩包内存储为原JSON文件名
            zipper.writestr(source_json_name, infile_content)           
        # 退出with块后再上传完整的ZIP缓冲区内容
        s3.put_object(Bucket=bucket_name, Key=f"{bucket_path}/{zip_save_name}", Body=zip_buffer.getvalue())            
    except Exception:
        print(traceback.format_exc())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:24:04