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。

最佳答案

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。那应该产生您要查找的字节。

我希望这证明是有用的。

关于python - MultipleFileField wtforms,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53021662/

10-11 06:21