Flask 文件上传与下载
相关配置
# 设置文件上传保存路径 app.config['UPLOAD_FOLDER'] = 'static/upload/' # MAX_CONTENT_LENGTH设置上传文件的大小,单位字节 app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024
@app.route('/upload', methods=['GET', 'POST']) def upload(): if(request.method == 'GET'): return render_template('upload.html'); else: # file为上传表单的name属性值 f = request.files['file']; fname = secure_filename(f.filename); ext = fname.rsplit('.')[-1]; # 生成一个uuid作为文件名 fileName = str(uuid.uuid4()) + "." + ext; # os.path.join拼接地址,上传地址,f.filename获取文件名 f.save(os.path.join(app.config['UPLOAD_FOLDER'], fileName)) return 'ok';
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# enctype设置不对字符编码 #} <form action="upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" accept=".jpg, .png" /> <input type="submit" /> </form> </body> </html>
下载
# 图片下载 @app.route('/download/<filename>', methods=['GET']) def download(filename): if request.method == "GET": path = os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], filename)); if path: return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)
一般开发中会把上传文件的信息,如文件名、路径等信息保存在数据库中。可以在上传文件视图函数中添加保存文件信息方法。
from flask import Flask, render_template, request, send_from_directory from werkzeug.utils import secure_filename import os import uuid app = Flask(__name__) # 设置文件上传保存路径 app.config['UPLOAD_FOLDER'] = 'static/upload/' # MAX_CONTENT_LENGTH设置上传文件的大小,单位字节 app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024 @app.route('/upload', methods=['GET', 'POST']) def upload(): if(request.method == 'GET'): return render_template('upload.html'); else: f = request.files['file']; fname = secure_filename(f.filename); ext = fname.rsplit('.')[-1]; # 生成一个uuid作为文件名 fileName = str(uuid.uuid4()) + "." + ext; # os.path.join拼接地址,上传地址,f.filename获取文件名 f.save(os.path.join(app.config['UPLOAD_FOLDER'], fileName)) return 'ok'; # 图片下载 @app.route('/download/<filename>', methods=['GET']) def download(filename): if request.method == "GET": path = os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], filename)); if path: return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True) if __name__ == '__main__': app.run()
在 Flask 中处理文件上传非常简单。它需要一个 HTML 表单,其 enctype
属性设置为“multipart/form-data”
,将文件发布到 URL。
URL 处理程序从 request.files[]
对象中提取文件,并将其保存到所需的位置。
每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。
目标文件的名称可以是硬编码的,也可以从 request.files[file]
对象的filename
属性中获取。
但是,建议使用 secure_filename()
函数获取它的安全版本。
可以在 Flask 对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
app.config['UPLOAD_FOLDER'] 定义上传文件夹的路径
app.config['MAX_CONTENT_LENGTH'] 指定要上传的文件的最大大小(以字节为单位)
以下代码具有 '/upload'
URL 规则,该规则在 templates 文件夹中显示'upload.html'
,以及 '/upload-file'
URL 规则,用于调用 uploader()
函数处理上传过程。
'upload.html'
<html> <head> <title>File Upload</title> </head> <body> <form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="提交" /> </form> </body> </html>
选择文件后,单击提交。
表单的` post `方法调用` '/upload_file'` URL。
底层函数 `uploader()` 执行保存操作。
以下是 Flask 应用程序的 Python 代码。
from flask import Flask, render_template, request from werkzeug.utils import secure_filename import os app = Flask(__name__) app.config['UPLOAD_FOLDER'] = 'upload/' @app.route('/upload') def upload_file(): return render_template('upload.html') @app.route('/uploader',methods=['GET','POST']) def uploader(): if request.method == 'POST': f = request.files['file'] print(request.files) f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename))) return 'file uploaded successfully' else: return render_template('upload.html') if __name__ == '__main__': app.run(debug=True) 注意:app.config['UPLOAD_FOLDER'] = 'upload/'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现