Wtforms,多选文件上传

Ana*_*ees 6 python flask wtforms flask-wtforms

我有一个包含姓名和图片的表格

MyForm的:

    name = TextField(
    u'name',
    validators=[
        validators.DataRequired(),
        validators.Length(min=1, max=25)
    ]
)   

    pictures = FileField(
    u'pictures',
    validators=[
        FileRequired(),
        FileAllowed(['jpg', 'png'], 'Images only!')
    ]
)
Run Code Online (Sandbox Code Playgroud)

Jinja2模板:

{% from "_form_helpers.tpl" import render_field %}
<form method="post" action="" enctype="multipart/form-data">
  <dl>
    {{ render_field(form.name) }}
    {{ render_field(form.pictures) }}
  </dl>
  <p>{{ form.submit }}
</form>
Run Code Online (Sandbox Code Playgroud)

我想在一个字段中上传一个或多个图片(多选).

这该怎么做?

谢谢..

Mar*_*way 7

您需要为输入标记指定multiple属性.这可以在您的模板中完成,如下所示:

form.pictures(multiple="")

这将导致您生成的html允许多个文件选择:

<input id="pictures" multiple name="pictures" type="file">

如何使用request.files操作多个文件:

    images = request.files.getlist("pictures")
    if images:
        for img in images:
            # Create Images
            file_name = str(uuid.uuid4()) + secure_filename(img.filename)
            image_file = os.path.join(app.config['UPLOAD_FOLDER'], file_name)
            img.save(image_file)

            # Save record
            image = models.Image(record_id=record.record_id,
                                 file_name=file_name.encode('utf-8'))
            db.session.add(image)

    db.session.commit()
Run Code Online (Sandbox Code Playgroud)


Hie*_*ieu 5

来自:http://wtforms.readthedocs.org/en/latest/fields.html

render_kw(dict) - 如果提供,则提供一个字典,该字典提供将在呈现时提供给窗口小部件的默认关键字.

因此,您可以传递{multiple: True}到字段定义,如下所示:

forms.py

class UploadImages(Form):\n\n    imgs = FileField(\n        \'Select images\',\n        render_kw={\'multiple\': True},\n    )\n    upload = SubmitField(\'Upload\')\n
Run Code Online (Sandbox Code Playgroud)

uploade_template.html

{% import "bootstrap/wtf.html" as wtf %}\n{{ wtf.quick_form(form) }}\n
Run Code Online (Sandbox Code Playgroud)