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)
但它返回一个空列表,所以无论如何我可以处理这个将照片保存到目录中
这里有使用 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)
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |