【问题标题】:MultipleFileField wtformsMultipleFileField wtforms
【发布时间】:2018-10-27 11:56:43
【问题描述】:
class AddProductForm(FlaskForm):
    product_pictures = MultipleFileField('Pictures')
    submit = SubmitField('Add Pictures')

    def product_add_pics():
        form = AddProductForm()
        if form.validate_on_submit():
            if form.product_pictures.data:
                for picture_upload in form.product_pictures.data:
                    print(type(picture_upload))

表格:

<div class="form-group">
    {{ form.product_pictures.label() }}
    {{ form.product_pictures(class="form-control-file") }}
    {% if form.product_pictures.errors %}
        {% for error in form.product_pictures.errors %}
            <span class="text-danger">{{ error }}</span>
        {% endfor %}
    {% endif %}
</div>

我总是将类型作为字符串。如何获取二进制文件?我使用 wtforms 中的 MultipleFileField。

【问题讨论】:

    标签: python flask wtforms multiple-file-upload


    【解决方案1】:

    FileField 类的documentation 专门说明了以下有关处理文件内容的内容:

    默认情况下,该值将是表单数据中发送的文件名。 WTForms 不处理框架的文件处理能力。

    这同样适用于MultipleFileField 类。

    这意味着您必须向flask 询问这些文件。而且,最快的方法是使用request.files 处理您正在处理的请求。

    总之,您需要重写您的product_add_pics 函数以从request 对象中获取文件,如下所示:

    from flask import request
    
    
    
    def product_add_pics():
        form = AddProductForm()
        if form.validate_on_submit():
            pics = request.files.getlist(form.product_pictures.name)
            if pics:
                for picture_upload in pics:
                    picture_contents = picture_upload.stream.read()
                    print(type(picture_contents))
                    # Do everything else you wish to do with the contents
    

    您会在此处注意到request.files.getlist 的用法。这很重要,因为您使用 MultipleFielField 类来接受多个文件。使用.getlist 可以检索最终用户从他们的机器中选择的所有文件。

    最后,要获取每个文件中包含的字节,您需要获取每个文件的streamread。这应该会产生您正在寻找的字节。

    我希望这证明有用。

    【讨论】:

      【解决方案2】:

      我知道这个问题很老,但我花了四个小时将头撞在墙上试图找到解决方案,最后在错误代码的帮助下找到了答案。 MultiFileField 会将文件名作为字符串返回,除非您在表单中指定正确的编码。只需添加:

      enctype="multipart/form-data"
      

      到 HTML 表单标签,原始代码将返回

      <class 'werkzeug.datastructures.FileStorage'>
      

      正如预期的那样。

      【讨论】:

        猜你喜欢
        • 2021-09-03
        • 1970-01-01
        • 2020-05-01
        • 1970-01-01
        • 2013-08-21
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多