Как загрузить несколько файлов с помощью flask-wtf?

1

Я пытаюсь загрузить несколько файлов с помощью 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>

Это возвращает первый файл, но мне нужно, чтобы вернуть все выбранные файлы. Список будет наиболее полезным, но любая структура данных, которую я могу распаковать, будет работать. Благодарю.

Теги:
flask-wtforms

1 ответ

2

Вместо использования 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)
  • 0
    Огромное спасибо! Я думаю, что часть моей проблемы была на самом деле валидаторы, ломающие загрузку. Я удалил это и обработал form.files.data в цикле, как предложено, и теперь он работает.
  • 0
    = form.data_file.data не похоже на правильный синтаксис. Чего мне не хватает?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню