
本文讲解如何通过 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/










