【问题标题】:How to upload multiple files with flask-wtf?如何使用 flask-wtf 上传多个文件?
【发布时间】:2019-05-22 05:48:21
【问题描述】:

我正在尝试使用 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>

这将返回第一个文件,但我需要它返回所有选定的文件。列表将是最有用的,但我可以解压缩的任何数据结构都可以。谢谢。

【问题讨论】:

    标签: python flask-wtforms


    【解决方案1】:

    不要使用 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)
    

    【讨论】:

    • 非常感谢!我认为我的问题的一部分实际上是验证器破坏了上传。我删除了它并按照建议在循环中处理了 form.files.data 并且它现在正在工作。
    • = form.data_file.data 似乎不是有效的语法。我错过了什么?
    • 不知道是怎么搞砸的——我解决了这个问题。那条线根本不应该存在!
    • datadata_filename 定义在哪里?
    • 对我不起作用。当我尝试此 files 是一个字符串时,我收到错误消息,即字符串 files 没有属性 filename
    【解决方案2】:
    from wtforms import MultipleFileField
    from werkzeug 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)
    

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多