diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index ab18ec2db..14eafe4d2 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -900,7 +900,10 @@ async def _extract_form_body( assert isinstance(value, sequence_types) results: list[bytes | str] = [] for sub_value in value: - results.append(await sub_value.read()) + if isinstance(sub_value, UploadFile): + results.append(await sub_value.read()) + else: + results.append(sub_value) value = serialize_sequence_value(field=field, value=results) if value is not None: values[get_validation_alias(field)] = value diff --git a/tests/test_optional_file_list.py b/tests/test_optional_file_list.py index 686025864..0e11a262a 100644 --- a/tests/test_optional_file_list.py +++ b/tests/test_optional_file_list.py @@ -1,5 +1,3 @@ -from typing import Optional - from fastapi import FastAPI, File from fastapi.testclient import TestClient @@ -7,7 +5,7 @@ app = FastAPI() @app.post("/files") -async def upload_files(files: Optional[list[bytes]] = File(None)): +async def upload_files(files: list[bytes] | None = File(None)): if files is None: return {"files_count": 0} return {"files_count": len(files), "sizes": [len(f) for f in files]} @@ -28,3 +26,13 @@ def test_optional_bytes_list_no_files(): response = client.post("/files") assert response.status_code == 200 assert response.json() == {"files_count": 0} + + +def test_optional_bytes_list_send_empty_str(): + client = TestClient(app) + response = client.post( + "/files", + data={"files": ""}, + ) + assert response.status_code == 200 + assert response.json() == {"files_count": 1, "sizes": [0]}