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.
Running the ApplicationRun the Application by running “python multiplefilesupload.py”. Go to browser and type “http://localhost:5000”, you will see “upload files” in browser.
Python for web development using Flask Handling file upload in Flask is very easy. It needs an HTML form with its enctype attribute set to 'multipart/form-data', posting the file to a URL. The URL handler fetches file from request. files[] object and saves it to the desired location.
Instead of using the FileField, use the MultipleFileField. It supports multiple files.
For example:
from wtforms import MultipleFileField
class NewFileForm(FlaskForm):
files = MultipleFileField('File(s) Upload')
Then to access the files:
@app.route('/', methods=['GET', 'POST'])
def upload():
form = NewFileForm()
if form.validate_on_submit():
files_filenames = []
for file in form.files.data:
file_filename = secure_filename(file.filename)
data.save(os.path.join(app.config['UPLOAD_FOLDER'], data_filename))
files_filenames.append(file_filename)
print(files_filenames)
return render_template('input_form.html', form=form)
return render_template('input_form.html', form=form)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With