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

Flask框架下实现多文件/单个SQL文件下载的问题及方案咨询

Flask多SQL文件下载实现方案

问题排查

你提供的代码无法运行核心有两个原因:

  1. send_file() 不支持直接传入文件路径列表作为参数,哪怕列表中只有单个文件也无法被正常识别,因此单文件场景也会报错
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:07