'Fastapi Multipart/form data error when uploading File with JSON data
My Pydantic model looks like ths:
class Banner:
title: str
text: str
My route looks like this:
@router.post('', status_code=201)
async def create_banner(
banner: Banner,
photo: UploadFile = File(...) # multipart/form-data
):
return await Banners.create(banner.dict())
But FastAPI returns the following error:
Solution 1:[1]
According to the FastAPI docs:
You can declare multiple
FileandFormparameters in a path operation, but you can't also declareBodyfields that you expect to receive as JSON, as the request will have the body encoded usingmultipart/form-datainstead ofapplication/json.This is not a limitation of FastAPI, it's part of the HTTP protocol.
And when passing an object, FastAPI will try to treat it as a body specification, not as a form field. That means, you have to explicitly define your banner argument as a form field:
@router.post('', status_code=201)
async def create_banner(
banner: Banner = Form(...),
photo: UploadFile = File(...) # multipart/form-data
):
return await Banners.create(banner.dict())
Make also sure that your Banner object is a valid pydantic model, as FastAPI can't recognize bare objects properly in this context.
Solution 2:[2]
Update
More options can be found at this answer.
Original answer:
In short, you can't have Pydantic models (JSON data) and Form (and/or File) data together. You can either use Form fields, sending the data as form data in the body, or Dependencies with Pydantic models, sending the data as query parameters. Examples below.
@router.post("/")
async def create_banner(title: str = Form(...), text: str = Form(...), photo: UploadFile = File(...)):
return {"JSON Payload ": {"title": title, "text": text}, "Uploaded Filename": photo.filename}
or
from pydantic import BaseModel
from fastapi import Depends
class Banner(BaseModel):
title: str
text: str
@router.post("/")
async def create_banner(banner: Banner = Depends(), photo: UploadFile = File(...)):
return {"JSON Payload ": banner.dict(), "Uploaded Filename": photo.filename}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | GwynBleidD |
| Solution 2 |

