我想使用以下方法获取上传照片的列表:photos = request.files.getlist("photo")
.但是,如果我没有在浏览器中选择任何文件,则photos
值不会像其他字段那样为空。
我想通过执行以下操作来检查是否没有提交任何文件:
if not photos:
pass
但是,即使未提交任何文件,也始终存在一个空的FileStorage
对象:
request.files.getlist("photo")
[<FileStorage: '' ('application/octet-stream')>]
为什么会出现在那里?如果列表从不为空,如何检查是否未上传任何文件?
request.files
填充了客户端提交的任何内容。不幸的是,即使没有选择任何文件,浏览器也会提交文件输入,这看起来像一个没有名称和没有数据的文件。名称或数据都不需要有效的空文件,因此由应用决定要执行的操作。
如果FileStorage
没有名称,它将被视为False
。Flask-WTF 认为没有名称的FileStorage
为空以进行验证。
photo = request.files["photo"]
if not photo:
# no photo
photos = request.files["photo"].getlist()
if not photos or not any(f for f in photos):
# no photos
关于空文件存储对象,表示如果在提交表单时文件字段留空,并且您正在获得一个空的文件存储对象,并且想要过滤它。
if not (all(isinstance(item, FileStorage) for item in field.data) and
field.data and all((item.filename != '') for item in field.data)):
return
对于没有上传的文件,FileStorage 对象文件名属性类似于 field.data.file.filename = '',以便我们可以根据此条件对其进行过滤。