如何使用Flask框架send_file发送zip文件 下载空压缩包问题求助
Flask内存Zip文件下载为空问题修复方案
核心错误原因
- 缺少
os模块导入:代码中调用了os.path.basename方法但未导入对应模块,会触发运行时异常,干扰响应生成 - MIME类型配置错误:
send_file的mimetype参数需填写标准值application/zip,填写zip不符合HTTP规范,会导致浏览器识别文件异常 - 版本兼容问题:Flask 2.0及以上版本已弃用
attachment_filename参数,替换为download_name参数,参数不匹配会导致响应构造失败 - 路径逻辑问题:原有代码创建
ZipInfo时传入了本地完整路径,打包后的文件会携带不必要的目录层级,不符合常规使用需求
修正后可运行代码
场景1:打包多个文本文档到内存Zip(匹配你的需求)
import os from flask import send_file import io import zipfile import time @app.route('/downloads/', methods=['GET']) def download(): # 可自行替换为业务场景下的实际文本内容列表 text_files = [ {"filename": "doc1.txt", "content": "第一个文本文档的内容"}, {"filename": "doc2.txt", "content": "第二个文本文档的内容"} ] fileobj = io.BytesIO() with zipfile.ZipFile(fileobj, 'w', zipfile.ZIP_DEFLATED) as zip_file: for file in text_files: zip_info = zipfile.ZipInfo(file["filename"]) zip_info.date_time = time.localtime(time.time())[:6] zip_file.writestr(zip_info, file["content"]) fileobj.seek(0) return send_file( fileobj, mimetype='application/zip', as_attachment=True, # 低版本Flask请将download_name替换为attachment_filename download_name='text_package.zip' )
场景2:打包本地已有Zip文件到内存输出
import os from flask import send_file import io import zipfile import time @app.route('/downloads/', methods=['GET']) def download(): FILEPATH = r"C:\Users\JD\Downloads\trydownload.zip" fileobj = io.BytesIO() with zipfile.ZipFile(fileobj, 'w', zipfile.ZIP_DEFLATED) as zip_file: zip_info = zipfile.ZipInfo(os.path.basename(FILEPATH)) zip_info.date_time = time.localtime(time.time())[:6] with open(FILEPATH, 'rb') as fd: zip_file.writestr(zip_info, fd.read()) fileobj.seek(0) return send_file( fileobj, mimetype='application/zip', as_attachment=True, download_name='%s' % os.path.basename(FILEPATH) )
内容的提问来源于stack exchange,提问作者Josh.h
相关产品推荐
相关产品推荐

