MultiFileField 没有 Return 文件,returns _str_

MultiFileField Doesn't Return Files, returns _str_

我正在尝试使用“MultiFileField”在 Flask 中使用 WTForms 上传多张图片,但是,它 returns 是一个字符串而不是文件对象。 所以我尝试使用以下内容:

request.files.getlist(form.upload_field.data)

但它 returns 是一个空列表,所以无论如何我都可以处理这个以将照片保存到目录中

有使用 Flask 上传文件的文档 here,您将通过访问 request.files 对象以正确的方式进行操作。我遇到了两种从那里获取空列表的方法:

1. enctype 表单 html 属性未设置

这是呈现 MultipleFileField():

的示例模板
template = """
<form action="" method="POST" enctype="multipart/form-data">
{{ form.upload_field() }}
{{ form.submit() }}
</form>
"""

如果我删除 enctype=... 部分,文件列表 returns 为空,否则它会有值。 page on the internet 说:

This value is required when you are using forms that have a file upload control

2。将错误的密钥传递给 request.files.getlist()

request.files 是一个 werkzeug.MultiDict,它是键到值的映射,旨在处理同一键的多个值。

使用与上面相同的表单模板,在 POST 上检查 request.files (print(list(request.files.keys()))) 的键显示 ['upload_field'].

werkzeug.MultiDict.getlist 有一个 必需的 参数:

key - The key to be looked up.

所以此时 MultiDict 实例中唯一的键是字符串 'upload_field',如果我们想从 getlist 方法中取回任何东西,这需要是我们传递的键至 getlist。在您的示例代码中,您传递了 form.upload_field.data 属性的值(在我的测试中为 None)。将其更改为 'upload_field',您应该离开。

这是一个最小的工作示例,它将在表单提交时打印调用 request.files.getlist() 的结果。 运行 脚本,在浏览器中访问 http://127.0.0.1:5000,上传几个文件并观察终端输出。

from flask import Flask, render_template_string, request
from wtforms import Form, MultipleFileField, SubmitField


app = Flask(__name__)


class MyForm(Form):
    upload_field = MultipleFileField()
    submit = SubmitField()


template = """
<form action="" method="POST" enctype="multipart/form-data">
{{ form.upload_field() }}
{{ form.submit() }}
</form>
"""


@app.route("/", methods=["GET", "POST"])
def route():
    form = MyForm()
    if request.method == "POST":
        print(request.files.getlist("upload_field"))
    return render_template_string(template, form=form)


if __name__ == "__main__":
    app.run(debug=True)