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

如何用Flask创建动态文件发送算法?解决多子目录路由冗余问题

只用单个Flask路由实现多子目录文件下载服务?

嘿,完全理解你的困扰——硬编码几十个路由不仅繁琐,后期维护起来也头疼!其实Flask早就为这种场景提供了便捷的解决方案,只用一个路由就能搞定所有子目录的文件下载需求。

问题回顾

你当前的文件结构是processedMain下包含多个子目录(processed1、processed2...processedN),每个子目录下有大量文件,之前需要为每个子目录单独编写@app.route和对应的视图函数,代码重复度极高。

极简解决方案

Flask的路径转换器(path:)可以捕获包含斜杠的完整路径,正好适配你的需求。只需要3行核心代码就能替代所有重复的路由:

from flask import send_file

@app.route('/<path:id>')
def returnImg(id):
    # 提取文件名,让用户下载时看到的是纯文件名而非完整路径
    fileName = id.rsplit('/', 1)[-1]
    return send_file(id, as_attachment=True, attachment_filename=fileName)

关键解释

  1. <path:id>路由规则:path:是Flask的内置转换器,它会把URL中从/之后的所有内容(包括子目录的斜杠)都捕获到id变量里,这样不管文件在哪个子目录下,都能通过这个路由匹配到。
  2. 文件名处理:id.rsplit('/', 1)[-1]是从完整路径中提取最后一个斜杠后的部分,也就是纯文件名,这样用户下载时看到的是xxx.jpg而不是processed1/xxx.jpg,体验更友好。

重要安全提示(新手必看)

为了避免恶意用户通过构造路径访问服务器上的敏感文件(比如../../etc/passwd),建议在视图函数中添加路径校验,限制只能访问processedMain目录下的文件:

import os
from flask import send_file, abort

@app.route('/<path:id>')
def returnImg(id):
    # 定义允许访问的根目录
    allowed_base_dir = os.path.abspath('processedMain')
    # 把用户传递的路径转为绝对路径
    target_file_path = os.path.abspath(id)
    
    # 检查目标路径是否在允许的根目录范围内
    if not target_file_path.startswith(allowed_base_dir):
        abort(403)  # 返回403禁止访问
    
    fileName = id.rsplit('/', 1)[-1]
    return send_file(target_file_path, as_attachment=True, attachment_filename=fileName)

这样就能在实现功能的同时,保障服务器的文件安全啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:46:11