阅读(4780) (16)

Flask 文件上传

2016-12-26 16:56:18 更新

在 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/'

upload 前面不能加“/”。 

上传成功会显示以下画面:


上次文件被放到根目录的 upload 文件夹下: