Flask 的 request.files.getlist for 在未提交字段时不为空



我想使用以下方法获取上传照片的列表: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 = '',以便我们可以根据此条件对其进行过滤。

最新更新