'How to upload multiple files with flask-wtf?
I am trying to upload multiple files with flask-wtf. I can upload a single file with no problems and I've been able to change the html tag to accept multiple files but as of yet I haven't been able to get more than the first file.
The attached code will give me the first file but I can't figure out how to get any more files from it. I suspect that "render_kw={'multiple': True}" just changes the HTML tag so I might be barking up the wrong tree with this approach. I have also stumbled across "MultipleFileField" from wtforms but I can't seem to get that to return any files, again likely since it doesn't play nice with the flask_wtf I'm trying to use. Is there a good way to do this?
@app.route('/', methods=['GET', 'POST'])
def upload():
form = Upload_Form(CombinedMultiDict((request.files, request.form)))
if form.validate_on_submit():
files = form.data_file.data
files_filenames = secure_filename(files.filename)
data.save(os.path.join(app.config['UPLOAD_FOLDER'], data_filename))
print(files_filenames)
return render_template('input_form.html', form=form)
return render_template('input_form.html', form=form)
class Upload_Form(FlaskForm):
data_file = FileField(render_kw={'multiple': True}, validators=[FileRequired(), FileAllowed(['txt'], 'text files only')])
<!--input_form.html--->
<form method=post enctype="multipart/form-data">
<table>
{{ form.hidden_tag() }}
{% for field in form %}
<tr>
<td>{% if field.widget.input_type != 'hidden' %} {{ field.label }} {% endif %}</td><td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<p><input type=submit value=Compute></form></p>
This returns the first file but I need it to return all files selected. A list would be most useful but any data structure that I can unpack would work. Thanks.
Solution 1:[1]
from wtforms import MultipleFileField
from werkzeug.utils import secure_filename
class Upload_Form(FlaskForm):
files = MultipleFileField(render_kw={'multiple': True})
And the route
@app.route('/', methods=['GET', 'POST'])
def upload():
form = Upload_Form()
if form.validate_on_submit():
for file in form.files.data:
file_name = secure_filename(file.filename)
file.save(file_name)
Solution 2:[2]
You could put it on the model or just use the full namespace. Try
{{ App\Http\Controllers\Todo::isDone() }}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | AlexElizard |
| Solution 2 | mankowitz |
