Как загрузить несколько файлов с помощью flask-wtf? - PullRequest
0 голосов
/ 21 декабря 2018

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

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

1 Ответ

0 голосов
/ 02 января 2019

Вместо использования 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)
...