Я пытаюсь загрузить несколько файлов с помощью flask-wtf. Я могу загрузить один файл без проблем, и я смог изменить html-тег, чтобы принимать несколько файлов, но пока я не смог получить больше, чем первый файл.
Прикрепленный код даст мне первый файл, но я не могу понять, как получить еще файлы из него. Я подозреваю, что "render_kw = {'multiple': True}" просто меняет тэг HTML, поэтому при таком подходе я, возможно, лаю не то дерево. Я также наткнулся на "MultipleFileField" из wtforms, но, похоже, я не могу получить это, чтобы вернуть какие-либо файлы, опять же, вероятно, так как это не очень хорошо работает с flask_wtf, который я пытаюсь использовать. Есть ли хороший способ сделать это?
@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>
Это возвращает первый файл, но мне нужно, чтобы вернуть все выбранные файлы. Список будет наиболее полезным, но любая структура данных, которую я могу распаковать, будет работать. Благодарю.
Вместо использования FileField, используйте MultipleFileField. Он поддерживает несколько файлов.
Например:
from wtforms import MultipleFileField
class NewFileForm(FlaskForm):
files = MultipleFileField('File(s) Upload')
Затем для доступа к файлам:
@app.route('/', methods=['GET', 'POST'])
def upload():
form = NewFileForm()
if form.validate_on_submit():
file_filenames = []
for files in form.files.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)
= form.data_file.data
не похоже на правильный синтаксис. Чего мне не хватает?