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>我总是把类型作为字符串。如何获取二进制文件?我使用wtforms中的MultipleFileField。
发布于 2019-04-18 01:45:37
FileField类的documentation特别说明了有关处理文件内容的以下内容:
默认情况下,该值将是在表单数据中发送的文件名。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操作。这应该会产生您要查找的字节数。
我希望这被证明是有用的。
发布于 2021-09-19 02:14:54
我知道这个问题很老,但我花了四个小时的时间拼命寻找解决方案,最后在一个错误代码的帮助下解决了这个问题。除非您在表单中指定了正确的编码,否则MultiFileField将以字符串形式返回文件名。只需添加:
enctype="multipart/form-data"添加到HTML form标记中,原始代码将返回
<class 'werkzeug.datastructures.FileStorage'>不出所料。
https://stackoverflow.com/questions/53021662
复制相似问题