Flask框架下实现多文件/单个SQL文件下载的问题及方案咨询
Flask多SQL文件下载实现方案
问题排查
你提供的代码无法运行核心有两个原因:
send_file()不支持直接传入文件路径列表作为参数,哪怕列表中只有单个文件也无法被正常识别,因此单文件场景也会报错- HTTP 协议本身不支持单次响应返回多个独立文件,多文件下载必须先打包为压缩包(通用zip格式兼容性最好)再返回
实现步骤
- 先按照你的业务规则筛选出所有需要下载的.sql格式文件
- 在内存中生成zip压缩包,将所有目标文件写入压缩包
- 调整响应头,将内存中的zip包返回给浏览器触发下载
完整可运行代码
首先确认你安装了对应依赖,代码示例如下:
import pathlib import zipfile from io import BytesIO from flask import Flask, send_file app = Flask(__name__) # 此处的names为你自定义的需要匹配的文件名前缀列表,请根据业务逻辑自行赋值 names = ["test1", "test2", "backup"] @app.route('/download_files') def download(): # 筛选符合规则的.sql文件 download_list = [] target_dir = pathlib.Path("dir1/dir2") for path in target_dir.iterdir(): if path.is_file() and path.suffix == ".sql": if path.stem in names: download_list.append(path) # 无匹配文件时返回错误提示 if not download_list: return "未找到符合要求的可下载文件", 404 # 内存中创建zip压缩包 zip_buffer = BytesIO() with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_f: for file_path in download_list: # arcname参数指定文件在压缩包内的文件名,避免带入本地完整路径 zip_f.write(file_path, arcname=file_path.name) # 重置文件指针到起始位置,否则send_file会读取空内容 zip_buffer.seek(0) # 返回压缩包触发下载 return send_file( zip_buffer, mimetype="application/zip", as_attachment=True, download_name="sql_backup_files.zip" ) if __name__ == "__main__": app.run(debug=True)
注意事项
- 如果需要处理的文件总大小超过100M,建议先写入服务器临时文件再返回,避免占用过多服务器内存
- 旧版本Flask请将
download_name参数替换为attachment_filename,不要同时传入两个参数避免冲突
内容的提问来源于stack exchange,提问作者eraisedtothepowerx
相关产品推荐
相关产品推荐

