From 1be664f52f8aa6fa91117df69fd280788ebfe923 Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Wed, 12 Nov 2025 22:48:28 +0100 Subject: [PATCH] Fix mediatype for `Form` model with `File` field --- fastapi/openapi/utils.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py index dbc93d289..f81ad6050 100644 --- a/fastapi/openapi/utils.py +++ b/fastapi/openapi/utils.py @@ -8,6 +8,7 @@ from fastapi._compat import ( JsonSchemaValue, ModelField, Undefined, + get_cached_model_fields, get_compat_model_name_map, get_definitions, get_schema_from_model_field, @@ -23,7 +24,7 @@ from fastapi.dependencies.utils import ( from fastapi.encoders import jsonable_encoder from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX from fastapi.openapi.models import OpenAPI -from fastapi.params import Body, ParamTypes +from fastapi.params import Body, File, Form, ParamTypes from fastapi.responses import Response from fastapi.types import ModelNameMap from fastapi.utils import ( @@ -185,6 +186,16 @@ def get_openapi_operation_request_body( ) field_info = cast(Body, body_field.field_info) request_media_type = field_info.media_type + if ( + isinstance(field_info, Form) + and request_media_type == "application/x-www-form-urlencoded" + and lenient_issubclass(body_field.type_, BaseModel) + ): # Enforce multipart/form-data media type for Form models with File fields + form_model_fields = get_cached_model_fields(body_field.type_) + if any( + isinstance(form_field.field_info, File) for form_field in form_model_fields + ): + request_media_type = "multipart/form-data" required = body_field.required request_body_oai: Dict[str, Any] = {} if required: