如何使用烧瓶-wtf上传多个文件



我正在尝试使用flask-wtf上传多个文件。我可以毫无问题地上传单个文件,并且我已经能够更改 html 标签以接受多个文件,但到目前为止,我无法获得超过第一个文件的文件。

附加的代码会给我第一个文件,但我无法弄清楚如何从中获取更多文件。我怀疑"render_kw={'multiple': True}"只是更改了 HTML 标签,所以我可能用这种方法吠错了树。我也偶然发现了来自 wtforms 的"MultipleFileField",但我似乎无法让它返回任何文件,这可能是因为它与我尝试使用的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():
        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)
from wtforms import MultipleFileField
from werkzeug.utils import secure_filename
class Upload_Form(FlaskForm):
   files = MultipleFileField(render_kw={'multiple': True})

和路线

@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)

最新更新