Python使用Flask框架实现文件上传的操作指南

蓝鲸
蓝鲸
发布时间:2026-10-11 | 2人浏览过
原创

使用 Flask 框架处理文件上传时,上传数据会暂时存放于内存或临时位置。开发者可通过 request.files 字典获取文件对象,利用 secure_filename() 过滤非法字符后调用 save() 方法将文件安全保存至服务器磁盘。本文完整演示后端路由配置、前端表单编写及本地运行验证流程。

使用 Flask 处理文件上传的核心流程

在 Flask 中接收客户端发送的文件流时,所有已上传的文件均被存储在内存或文件系统的临时位置。通过请求对象的 files 属性可以访问这些文件,其返回结构类似标准字典。每个上传的文件对象基本等同于 Python 内置文件对象,并额外提供了将数据持久化到服务器的 save() 方法。

Flask本地服务启动后的文件上传页面主界面
访问 /upload 路由后可见的初始交互页面

第1步:配置后端路由与安全校验参数

目的:建立 POST 请求接收端点,限制请求体积以防止内存耗尽,并使用工具函数拦截恶意文件名。
入口:项目根目录下的主应用文件(如 app.py)。
动作:引入 request 与 secure_filename,创建 Flask 实例后注入配置文件。为保持实际可运行性,需显式指定存储目录并确保其存在。

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
# 限制最大上传体积为 16MB,超出则触发 413 错误
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
UPLOAD_FOLDER = 'static/uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['file']
        print(request.files)
        # 清理文件名中的危险字符与路径前缀
        safe_name = secure_filename(f.filename)
        dest_path = os.path.join(app.config['UPLOAD_FOLDER'], safe_name)
        f.save(dest_path)
        return 'file uploaded successfully'
    else:
        return render_template('upload.html')

if __name__ == '__main__':
    app.run(debug=True)
浏览器文件选择对话框与参数绑定示意图
前端<input type="file">元素绑定的 name 属性需与后端 request.files['key'] 保持一致

第2步:编写符合 HTTP 规范的前端表单

目的:构造支持二进制大对象传输的 HTML 结构,确保文件块能正确发送至后端。
入口:Flask 模板目录 templates/ 下的 upload.html。
动作:定义表单提交目标地址,务必设置 method="POST" 与 enctype="multipart/form-data"。该编码方式会将表单拆分为多个块以包裹普通文本字段与二进制文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传示例</title>
</head>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" required/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

验证上传功能与本地运行状态

完成代码配置后,在终端执行脚本即可启动本地开发服务器。默认监听地址与端口为 http://localhost:5000。访问路径 /upload 加载前端页面后,点击选择文件并触发提交,控制台将打印请求参数信息,页面随后返回成功提示字符串。此时检查配置的 UPLOAD_FOLDER 目录,即可看到已落盘的真实文件。

文件提交成功后服务端反馈的纯文本响应截图
后端捕获成功保存事件后向浏览器返回的确认报文

运行中常见问题排查

  1. 413 Request Entity Too Large:未配置 MAX_CONTENT_LENGTH 且超过 Werkzeug 默认阈值。需在应用初始化阶段手动赋值对应字节数。
  2. KeyError: 'file':前端表单中 <input name="file"> 缺失或拼写错误,导致 request.files 索引失败。请核对前后端字段名称严格一致。
  3. 路径穿越攻击风险:若跳过 secure_filename() 直接拼接用户上传的路径名,攻击者可能通过包含 ../../etc/passwd 等字符串覆盖系统关键文件。务必始终对该方法返回值进行落盘操作。

以上就是使用 Flask 框架实现文件上传的详细操作指南,更多关于 Python Web 应用开发与数据存储管理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表