在模板中,你需要
mulitple在上传输入中添加属性:
<form method="POST" enctype="multipart/form-data"> <input type="file" name="photos" multiple> <input type="submit" value="Submit"></form>
然后在查看功能中,上传的文件可以通过列表获取
request.files.getlist('photos')。循环此列表并在每个项目(werkzeug.datastructures.FileStorage)上调用save()方法将它们保存在给定路径中:
import osfrom flask import Flask, request, render_template, redirectapp = 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')此外,你可能需要使用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)) # ...你也可以使用此方法生成随机文件名。
完整演示
视图:
import os
from flask import Flask, request, render_templatefrom werkzeug.utils import secure_filenameapp = 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)形成:
from flask_wtf import FlaskFormfrom wtforms import SubmitFieldfrom flask_wtf.file import FileField, FileAllowed, FileRequiredclass UploadForm(FlaskForm): photo = FileField('Image', validators=[ FileRequired(), FileAllowed(photos, 'Image only!') ]) submit = SubmitField('Submit')模板:
<form method="POST" enctype="multipart/form-data"> {{ form.hidden_tag() }} {{ form.photo(multiple="multiple") }} {{ form.submit }}</form>


