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

Flask's request.files.getlist for isn't empty when field is not submitted

我想通过以下方式获取已上传照片的列表: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

关于空文件存储对象,意味着如果在提交表单时文件字段留空并且您得到一个空文件存储对象,并且想要过滤it.you 可以应用下面提到的检查。

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 = '',这样我们就可以根据这个条件进行过滤。