You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FastAPI上传图片时出现Unprocessable Entity错误是什么原因?

问题产生原因

FastAPI 接口只要声明了 File/UploadFile 类型参数,就会自动使用 multipart/form-data 格式解析请求,而 form-data 原生不支持直接传递嵌套 JSON 结构。
你现有代码中 schemas.Item 类型的 request 参数被默认作为 JSON Body 字段解析,添加文件参数后解析格式切换为 form-data,框架无法从 form-data 中定位到嵌套在 request 下的 name、price 字段,因此抛出422参数缺失错误。移除文件参数时接口默认使用 application/json 格式解析,参数可以正常映射,因此运行正常。

解决方法

两种常用兼容方案:

  • 方案1:拆分业务字段为独立Form参数
    将Pydantic模型内的字段直接声明为Form参数,和文件参数同属form-data根层级:
from fastapi import Form

@router.post('/', response_model=schemas.PostItem, status_code=status.HTTP_201_CREATED)
def create(
    name: str = Form(...),
    price: float = Form(...),
    file: UploadFile = File(...),
    db: Session = Depends(get_db)
):
    new_item = models.Item(
        name=name,
        price=price,
        user_id=1,
    )
    print(file.filename)
    db.add(new_item)
    db.commit()
    db.refresh(new_item)
    return new_item

请求时直接在form-data中添加name、price、file三个参数即可。

  • 方案2:将业务模型声明为查询参数
    给schemas.Item类型参数添加Depends()注解,让框架从URL查询参数中映射字段:
@router.post('/', response_model=schemas.PostItem, status_code=status.HTTP_201_CREATED)
def create(
    request: schemas.Item = Depends(),
    file: UploadFile = File(...),
    db: Session = Depends(get_db)
):
    new_item = models.Item(
        name=request.name,
        price=request.price,
        user_id=1,
    )
    print(file.filename)
    db.add(new_item)
    db.commit()
    db.refresh(new_item)
    return new_item

请求时将name、price放在URL查询参数中,文件放在form-data请求体中即可。


内容的提问来源于stack exchange,提问作者dianesis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:36:00