
Azure Functions 默认仅识别首个上传文件,需将 req.files 的 ImmutableDict 转为普通字典并启用 flat=False,才能遍历全部文件对象并准确统计数量。
azure functions 默认仅识别首个上传文件,需将 req.files 的 immutabledict 转为普通字典并启用 flat=false,才能遍历全部文件对象并准确统计数量。
在 Azure Functions(Python)中处理多文件上传时,开发者常遇到“仅读取第一个文件”的问题——即使通过 Postman 以 multipart/form-data 方式一次性上传多个文件(如 file1.txt, file2.jpg, file3.pdf),req.files.values() 却只返回一个文件对象,导致计数恒为 1。
根本原因在于:Azure Functions Python 运行时底层基于 Flask(v1.x),而 Flask 的 request.files 返回的是 Werkzeug 的 ImmutableMultiDict。当多个同名字段(如多个 )提交时,Werkzeug 默认将同名项合并为单个值(即取最后一个),除非显式指定 flat=False。此外,req.files.values() 直接调用会触发 ImmutableMultiDict.values() 的扁平化行为,丢失重复键的全部值。
✅ 正确做法是使用 .to_dict(flat=False) 将其转换为标准 Python 字典,其中每个键对应一个文件对象列表:
import logging
def main(req):
# ✅ 正确获取所有上传文件(支持同名多文件)
file_dict = req.files.to_dict(flat=False) # 返回: {'files': [<filestorage>, <filestorage>, ...]}
total_files = 0
for key, file_list in file_dict.items():
total_files += len(file_list)
for file in file_list:
filename = file.filename
content = file.stream.read() # 注意:读取后 stream 位置已到末尾
logging.info(f"Processed file: {filename}, size: {len(content)} bytes")
logging.info(f"Total uploaded files: {total_files}")
return f"Uploaded {total_files} file(s) successfully."</filestorage></filestorage>
? 关键注意事项:
-
前端表单必须使用
name="xxx"且多个共享同一 name(或使用multiple属性),后端才按同名分组; -
flat=False是核心参数,否则to_dict()仍只取每键的首个值; -
file.stream.read()会消耗流,若需多次读取,请先file.save()或缓存内容; - Azure Functions 有默认请求体大小限制(通常 100 MB),大文件需配置
maxRequestLength或启用流式处理; - 生产环境建议添加 MIME 类型校验、文件扩展名白名单及异常捕获(如
KeyError或IOError)。
通过该方式,即可稳定、准确地统计与处理任意数量的并发文件上传,真正实现多文件支持。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











