MultipleFileField wtforms - PullRequest
       19

MultipleFileField wtforms

0 голосов
/ 27 октября 2018
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>

Я всегда получал тип как строку. Как я могу получить двоичные файлы? Я использую MultipleFileField из wtforms.

1 Ответ

0 голосов
/ 17 апреля 2019

Документация для класса FileField специально говорит об обработке содержимого файла:

По умолчанию значением будет имя файла, отправляемое в данных формы. 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 позволяет получить все файлы, выбранные конечным пользователем на их компьютере.

И, наконец, чтобы получить байты, содержащиеся в каждом файле, вам нужно получить stream каждого файла и read его. Это должно привести к байтам, которые вы ищете.

Надеюсь, это окажется полезным.

...