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

上传ZIP存入SQLite后用zipfile读取报BadZipFile错误

问题根源与修复方案

1. 路由请求方法错误(最直接的触发点)

你的路由里写了methods=["GET", "SET"],但HTTP协议不存在SET方法,上传文件必须用POST方法。这个错误会导致后端无法正确接收上传的文件内容,zip_content要么是空值,要么是不完整的二进制数据,直接触发zipfile.BadZipFile错误。

修正后的路由:

@views.route("/upload", methods=["GET", "POST"])

2. 确保数据库二进制数据的完整性

存储到SQLite时,必须用BLOB类型字段存储原始bytes对象,绝对不能用文本类型(如TEXT),否则编码转换会破坏ZIP文件的二进制结构。

存储示例:

# 假设db是你的数据库连接对象
cursor = db.cursor()
cursor.execute("INSERT INTO zip_storage (file_data) VALUES (?)", (zip_content,))
db.commit()

读取示例:

cursor.execute("SELECT file_data FROM zip_storage WHERE id = ?", (target_id,))
zip_content = cursor.fetchone()[0]

3. 安全操作ZipFile对象

建议用with上下文管理器操作ZipFile,避免资源泄漏,同时明确指定读取模式:

with zipfile.ZipFile(io.BytesIO(zip_content), mode='r') as archive:
    # 示例:列出ZIP内的文件
    print(archive.namelist())

修正后的完整示例代码

from flask import Blueprint, request
import zipfile
import io

views = Blueprint('views', __name__)

@views.route("/upload", methods=["GET", "POST"])
def upload():
    if request.method == "POST":
        f = request.files['file']
        zip_content = f.read()
        
        # 模拟数据库存储
        # cursor.execute("INSERT INTO zip_storage (file_data) VALUES (?)", (zip_content,))
        # db.commit()
        
        # 模拟数据库读取
        # cursor.execute("SELECT file_data FROM zip_storage WHERE id = ?", (1,))
        # zip_content = cursor.fetchone()[0]
        
        try:
            with zipfile.ZipFile(io.BytesIO(zip_content), 'r') as archive:
                print("ZIP文件内容列表:", archive.namelist())
        except zipfile.BadZipFile as e:
            print(f"错误:{e}")
            return "无效的ZIP文件", 400
    return ""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:50:33