如何在python中使用flask上传多个文件

Jen*_*vat 2 python flask

这是我上传多个文件的代码:

HTML代码:

Browse <input type="file" name="pro_attachment1" id="pro_attachment1" multiple>
Run Code Online (Sandbox Code Playgroud)

PYTHON代码:

pro_attachment = request.files.getlist('pro_attachment1')

for upload in pro_attachment:
    filename = upload.filename.rsplit("/")[0]
    destination = os.path.join(application.config['UPLOAD_FOLDER'], filename)
    print "Accept incoming file:", filename
    print "Save it to:", destination
    upload.save(destination)
Run Code Online (Sandbox Code Playgroud)

但它上传的是单个文件而不是多个文件.

Gre*_* Li 12

如何

在模板中,您需要mulitple在上传输入中添加属性:

<form method="POST" enctype="multipart/form-data">
    <input type="file" name="photos" multiple>
    <input type="submit" value="Submit">
</form>    
Run Code Online (Sandbox Code Playgroud)

然后在视图功能中,上传的文件可以作为列表通过request.files.getlist('photos').循环此列表并在每个项目上调用save()方法(werkzeug.datastructures.FileStorage)将它们保存在给定的路径中:

import os

from flask import Flask, request, render_template, redirect

app = Flask(__name__)
app.config['UPLOAD_PATH'] = '/the/path/to/save'

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'photo' in request.files:
        for f in request.files.getlist('photo'):
            f.save(os.path.join(app.config['UPLOAD_PATH'], f.filename))
        return 'Upload completed.'
    return render_template('upload.html')
Run Code Online (Sandbox Code Playgroud)

此外,您可能需要使用secure_filename()清除文件名:

# ...
from werkzeug.utils import secure_filename
# ...
    for f in request.files.getlist('photo'):
        filename = secure_filename(f.filename)
        f.save(os.path.join(app.config['UPLOAD_PATH'], filename))
        # ...
Run Code Online (Sandbox Code Playgroud)

您还可以使用此方法生成随机文件名.

完整演示

视图:

import os

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

app = Flask(__name__)  
app.config['UPLOAD_PATH'] = '/the/path/to/save'

@main.route('/upload', methods=['GET', 'POST'])
def upload():
    form = UploadForm()
    if form.validate_on_submit() and 'photo' in request.files:
        for f in request.files.getlist('photo'):
            filename = secure_filename(f.filename)
            f.save(os.path.join(app.config['UPLOAD_PATH'], filename))
        return 'Upload completed.'
    return render_template('upload.html', form=form)
Run Code Online (Sandbox Code Playgroud)

形成:

from flask_wtf import FlaskForm
from wtforms import SubmitField
from flask_wtf.file import FileField, FileAllowed, FileRequired

class UploadForm(FlaskForm):
    photo = FileField('Image', validators=[
        FileRequired(),
        FileAllowed(photos, 'Image only!')
    ])
    submit = SubmitField('Submit')
Run Code Online (Sandbox Code Playgroud)

模板:

<form method="POST" enctype="multipart/form-data">
    {{ form.hidden_tag() }}
    {{ form.photo(multiple="multiple") }}
    {{ form.submit }}
</form>
Run Code Online (Sandbox Code Playgroud)

更多

要获得更好的上传体验,您可以尝试使用Flask-Dropzone.