FastAPI中使用bytes而非UploadFile时如何提取上传文件名
问题原因
你使用bytes类型作为File参数的接收类型时,FastAPI仅会将上传文件的二进制内容赋值给该参数,它本身是原生字节对象,不存在name属性,所以调用会报错。
解决方案
你已经在参数中注入了Request对象,可以直接从请求的multipart表单中提取对应文件字段的文件名,不需要修改原有bytes参数的定义,也无需调整客户端调用逻辑。
异步端点写法(推荐)
@app.post("/detect/") async def predict(request: Request, file: bytes = File(...)): # 解析请求中的multipart表单 form = await request.form() # 获取file字段对应的文件名 filename = form["file"].filename return f"Filename is {filename}"
同步端点写法
如果你的业务逻辑要求端点必须使用同步函数定义,可以通过run_in_threadpool处理表单解析:
from fastapi.concurrency import run_in_threadpool import asyncio @app.post("/detect/") def predict(request: Request, file: bytes = File(...)): # 同步场景下调用异步form解析方法 form = asyncio.run(request.form()) filename = form["file"].filename return f"Filename is {filename}"
注意:解析multipart表单需要提前安装依赖:
pip install python-multipart
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

