You need to enable JavaScript to run this app. Flask非表单POST请求接收zip文件写入后为空如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Flask非表单POST请求接收zip文件写入后为空如何解决?

问题根因

你使用的zipfile.ZipFile.write()方法入参要求为本地已存在的文件路径,无法直接写入内存中的二进制流,因此传入request.get_data()拿到的二进制内容后,生成的压缩包为空。

解决方案

场景1:仅需保存上传的原始zip文件

如果不需要操作压缩包内的文件,完全不需要调用zipfile模块,直接以二进制写入模式保存接收到的数据即可:

zip_content = request.get_data()
# 注意打开模式用wb(二进制写模式),不能用普通的w模式
with open(r'/my/path/myzip.zip', 'wb') as f:
    f.write(zip_content)

场景2:需要操作压缩包内的文件

如果需要读取、修改压缩包内的内容,需要先把二进制内容封装为BytesIO对象再交给ZipFile处理:

import zipfile
from io import BytesIO

# 读取上传的zip二进制内容
zip_content = request.get_data()
# 把二进制内容转为可被ZipFile识别的流对象
with zipfile.ZipFile(BytesIO(zip_content), 'r') as src_zip:
    # 示例:打印压缩包内所有文件名
    print(src_zip.namelist())
    # 示例:把原压缩包内容转存到本地文件
    with zipfile.ZipFile(r'/my/path/myzip.zip', 'w') as dst_zip:
        for file_name in src_zip.namelist():
            dst_zip.writestr(file_name, src_zip.read(file_name))

验证方式

你可以用curl命令直接发送raw二进制请求验证效果,不需要表单提交:

curl --request POST --data-binary "@/本地/测试文件.zip" http://你的服务地址/接口路径

内容的提问来源于stack exchange,提问作者Stéphane Baribeau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 23:00:04