
本文详解如何在 Azure Functions 的 HTTP 触发器中接收并批量处理多个文件上传,涵盖 Flask 风格 req.files 的正确用法、curl 多文件提交语法、文件遍历逻辑及常见陷阱规避。
本文详解如何在 azure functions 的 http 触发器中接收并批量处理多个文件上传,涵盖 flask 风格 `req.files` 的正确用法、curl 多文件提交语法、文件遍历逻辑及常见陷阱规避。
Azure Functions(Python)的 HTTP 触发器原生支持 multipart/form-data 请求,可通过 req.files 属性访问所有上传的文件——它是一个类似字典的对象(MultiDict),键为表单字段名,值为 FileStorage 对象。关键在于:必须为每个文件指定独立的表单字段名(即 -F "name=@file" 中的 name),而非重复使用同一字段名;否则后端仅能获取首个同名文件。
✅ 正确的多文件上传方式
1. 后端代码(推荐写法)
import azure.functions as func
import logging
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="http_trigger", auth_level=func.AuthLevel.ANONYMOUS)
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
try:
# 获取所有上传的文件(dict-like 对象)
files = req.files
if not files:
return func.HttpResponse("No files uploaded", status_code=400)
responses = []
for field_name, file in files.items():
# 注意:file.filename 是客户端原始文件名(含扩展名)
ext = file.filename.split('.')[-1].lower() if '.' in file.filename else 'unknown'
logging.info(f"Received file '{file.filename}' via field '{field_name}' (ext: {ext})")
if ext == 'zip':
responses.append(f"✅ ZIP processed: {file.filename}")
elif ext == 'txt':
responses.append(f"? TXT processed: {file.filename}")
else:
responses.append(f"⚠️ Unsupported: {file.filename} ({ext})")
return func.HttpResponse(
"\n".join(responses),
mimetype="text/plain",
status_code=200
)
except Exception as e:
logging.error(f"File processing failed: {e}")
return func.HttpResponse(f"Server error: {e}", status_code=500)
2. 前端提交(curl 示例)
确保每个 -F 参数使用唯一字段名(如 file1, file2),并显式指定文件路径:
curl -X POST "http://localhost:7071/api/http_trigger" \ -F "file1=@./test1.zip" \ -F "file2=@./notes.txt" \ -F "file3=@./image.png"
⚠️ 错误示例(仅处理第一个):
-F "file=@a.zip" -F "file=@b.txt"—— 因字段名重复,req.files['file']只返回最后一个。
3. 进阶提示
-
文件内容读取:若需读取二进制内容,调用
file.read()(注意内存限制,大文件建议流式处理或转存 Blob); -
文件名安全:生产环境务必校验
file.filename,防止路径遍历(如../../etc/passwd),推荐使用os.path.basename()提取纯文件名; -
大小限制:Azure Functions 默认请求体上限为 100 MB(Consumption Plan),可通过
host.json调整http.maxRequestBodySize; -
认证与授权:示例使用
ANONYMOUS,实际部署应结合ADMIN或 Azure AD 令牌验证。
通过以上结构化实现,你可稳定支持任意数量的多类型文件上传,并按扩展名执行差异化逻辑,同时保持代码健壮性与可维护性。











