From 167fed622c47793bf7cfb1d88902a11037bc345d Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Wed, 12 Apr 2023 13:53:18 +0200 Subject: [PATCH 1/3] Fix handling of value when multiple files in form-data It appears that the value list extracted from the `FormData` is not necessarily composed of `UploadFile` instances. --- fastapi/dependencies/utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index c581348c9..e5c7d777c 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -778,7 +778,10 @@ async def request_body_to_args( async with anyio.create_task_group() as tg: for sub_value in value: - tg.start_soon(process_fn, sub_value.read) + if isinstance(sub_value, UploadFile): + tg.start_soon(process_fn, sub_value.read) + else: + results.append(sub_value) value = sequence_shape_to_type[field.shape](results) v_, errors_ = field.validate(value, values, loc=loc) From 39cb6471f758fdeef8d19af520722d5706529fd0 Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Thu, 12 Feb 2026 16:32:11 +0100 Subject: [PATCH 2/3] Add test --- tests/test_optional_file_list.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/test_optional_file_list.py b/tests/test_optional_file_list.py index 686025864..f237346ee 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", + files=[("files", b"")], + ) + assert response.status_code == 200 + assert response.json() == {"files_count": 1, "sizes": [0]} From c524dd41e0caa45175394290ab8e6d0ff67dab2f Mon Sep 17 00:00:00 2001 From: Yurii Motov Date: Thu, 12 Feb 2026 16:46:01 +0100 Subject: [PATCH 3/3] Fix test to send empty string instead of empty file --- tests/test_optional_file_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_optional_file_list.py b/tests/test_optional_file_list.py index f237346ee..0e11a262a 100644 --- a/tests/test_optional_file_list.py +++ b/tests/test_optional_file_list.py @@ -32,7 +32,7 @@ def test_optional_bytes_list_send_empty_str(): client = TestClient(app) response = client.post( "/files", - files=[("files", b"")], + data={"files": ""}, ) assert response.status_code == 200 assert response.json() == {"files_count": 1, "sizes": [0]}