MultiFileField 不返回文件,返回 _str_

Sha*_*med 0 python file-upload flask flask-wtforms

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

request.files.getlist(form.upload_field.data)
Run Code Online (Sandbox Code Playgroud)

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

Sup*_*oot 5

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

1.enctype表单html属性未设置

这是一个呈现的示例模板MultipleFileField()

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

如果我删除该enctype=...部分,文件列表将返回空,否则它会有值。互联网上的一个页面说:

当您使用具有文件上传控件的表单时,需要此值

2. 传递错误的Keyrequest.files.getlist()

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

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

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

key - 要查找的键。

因此,此时 MultiDict 实例中唯一的键是 string '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)
Run Code Online (Sandbox Code Playgroud)