flask如何上传文件?

文件上传的基本概念实际上非常简单:

  1. 一个 <form> 标签被标记有 enctype=multipart/form-data ,并且在里面包含一个 <input type=file> 标签。
  2. 服务端应用通过请求对象上的 files 字典访问文件。
  3. 使用文件的 save()方法将文件永久地保存在文件系统上的某处。

下面代码实现功能:上传文件到一个指定的文件夹里, 然后将这个文件显示给用户

import os
from flask import Flask, request,redirect, url_for,send_from_directory
from werkzeug.utils import secure_filename

UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS @app.route('/', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) return redirect(url_for('uploaded_file',filename=filename)) @app.route('/uploads/<filename>') def uploaded_file(filename): return send_from_directory(app.config['UPLOAD_FOLDER'],filename)

UPLODED_FOLDER是我们储存上传的文件的地方,而 ALLOWED_EXTENSIONS 则是允许的文件类型的集合。

限制上传文件的后缀可以确保您的用户不能上传可能导致 XSS 问题(跨站脚本攻击XSS )的 HTML 文件。

我们永远不要相信用户的输入,试想一个人可以发送下列信息作为 filename 给您的应用:

filename = "../../../../home/username/.bashrc"

将这串字符与UPLODED_FOLDER 所指定的路径相连接,那么这个用户就可能有能力修改服务器文件系统上的一个文件,而他不应该拥有这种权限。

secure_filename() 函数则可以确保文件名的安全性,功能如下:

>>> secure_filename('../../../../home/username/.bashrc')
'home_username_.bashrc'

send_from_directory()函数能够提供对已上传文件的访问服务

上一篇:如何使用python复制和提取.gz文件


下一篇:php – 从文件夹显示图像(幻灯片)