上传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
相关产品推荐
相关产品推荐

