如何在 Flask 应用中安全地提供本地上传文件的 Web 访问

夜杰姑娘_8411

夜杰姑娘_8411

2026-04-30

332人浏览

原创

如何在 Flask 应用中安全地提供本地上传文件的 Web 访问

本文讲解如何通过 Flask 的 send_from_directory 为上传文件(如 receivedfiles/ 目录)配置专用路由,使其可通过 HTTP URL(如 http://localhost:5000/uploads/sampleimage1.png)直接访问,解决静态文件“404 Not Found”问题。

本文讲解如何通过 flask 的 `send_from_directory` 为上传文件(如 `receivedfiles/` 目录)配置专用路由,使其可通过 http url(如 `http://localhost:5000/uploads/sampleimage1.png`)直接访问,解决静态文件“404 not found”问题。

Flask 默认不会自动提供项目目录下的任意文件——即使 receivedfiles/ 与 myapp.py 同级,它也不是 Web 可访问的静态资源路径。直接请求 http://192.168.1.2:5000/receivedfiles/sampleimage1.png 失败,是因为该路径未被 Flask 显式注册为有效路由,服务器无权(且不应允许)按文件系统路径盲目映射 URL。

✅ 正确做法是:显式声明一个安全的文件服务端点,使用 Flask 内置的 send_from_directory 函数。它会严格校验请求的文件名是否位于指定目录内,防止路径遍历攻击(如 ../../../etc/passwd),兼顾安全性与可用性。

✅ 推荐实现方式(添加以下代码到你的 Flask 应用)

from flask import Flask, request, send_from_directory
import os

app = Flask(__name__)

# ? 新增:安全提供 receivedfiles 下的文件
@app.route('/uploads/<filename>')
def uploaded_file(filename):
    # 确保 filename 是安全的(send_from_directory 已内置校验)
    # 但建议额外过滤空字符、控制字符等(可选增强)
    if not filename or '..' in filename or filename.startswith('/'):
        return 'Invalid filename', 400
    return send_from_directory('receivedfiles', filename)</filename>

? 关键说明:

  • send_from_directory('receivedfiles', filename) 会将 filename 拼接到绝对路径 os.path.join(os.getcwd(), 'receivedfiles'),并验证结果是否仍在该目录内;
  • 路由 /uploads/ 是唯一推荐的 Web 访问入口,例如:
    http://localhost:5000/uploads/sampleimage1.png → 返回 receivedfiles/sampleimage1.png
    http://192.168.1.2:5000/uploads/sampleimage1.png → 同样有效(适用于局域网设备访问)

⚠️ 注意事项与最佳实践

  • 不要使用 static_folder 替代:将 receivedfiles/ 设为 static_folder 会暴露所有子目录结构,且无法对上传文件做权限隔离(如用户 A 上传的文件可能被用户 B 猜路径访问)。send_from_directory 提供了更细粒度、更安全的控制。
  • 确保目录存在且有读权限:启动前请确认 receivedfiles/ 目录已创建,且 Flask 进程有读取权限(MacOS 上通常默认满足)。
  • 生产环境需额外加固:若部署到生产环境(如使用 Gunicorn + Nginx),建议由反向代理(如 Nginx)直接服务静态文件,减轻 Flask 负担;此时 /uploads/ 路由应仅用于开发或小规模场景。
  • 前端调用示例(Flutter):
    final url = Uri.parse('http://192.168.1.2:5000/uploads/sampleimage1.png');
    final response = await http.get(url);
    if (response.statusCode == 200) {
      // 加载图片或处理二进制内容
    }

✅ 总结

只需新增一个 @app.route('/uploads/') 路由并调用 send_from_directory,即可安全、简洁地对外提供上传文件的 HTTP 访问能力。这不仅是技术上的正确解法,更是 Flask 官方推荐的安全实践——既避免了手动读取文件和设置 MIME 类型的繁琐,又从根本上杜绝了路径遍历风险。现在,你的 Flutter 应用、浏览器或其他客户端都能通过标准 URL 稳定获取文件了。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
flask框架如何搭建
flask框架如何搭建

搭建步骤:1、安装Python和Pip;2、创建虚拟环境;3、安装Flask;4、创建Flask应用;5、运行应用;6、访问应用。想了解更多flask框架的相关内容,可以阅读本专题下面的文章。

2024.06.27

3515

8

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

2025.08.25

5364

10

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

2025.12.15

296

16

Python uv使用教程
Python uv使用教程

本专题汇总了 Python uv 使用教程与高效使用指南,从 uv 安装配置、常用命令到虚拟环境、依赖管理与项目打包,系统讲解如何用 uv 替代 pip 与 poetry,全面提升 Python 项目开发效率,助你快速上手这一现代化包管理工具,打造干净高效的 Python 工作流。

2026.10.15

0

15

剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

2026.10.14

0

15

剧云AI剧本创作零基础入门
剧云AI剧本创作零基础入门

本专题系统讲解剧云AI剧本创作流程,涵盖灵感、梗概、大纲、分场与正文生成,帮助新手快速完成首个中文剧本项目。

2026.10.14

0

14

VibeKnow文档转视频操作指南
VibeKnow文档转视频操作指南

本专题讲解VibeKnow上传Word、TXT、Markdown等材料生成视频的方法,覆盖内容解析、脚本组织、画面生成与成片检查。

2026.10.14

0

15

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

2026.10.14

0

13

二狗PPT大纲编辑实操指南
二狗PPT大纲编辑实操指南

本专题聚焦二狗PPT结构化大纲的生成和修改,讲解标题、正文、目录、页数与页面顺序的调整方法,提升汇报逻辑和内容完整性。

2026.10.14

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习