From ca46fd041d1a61bd72640e5a263a080b692713a3 Mon Sep 17 00:00:00 2001 From: KnifeLemon Date: Thu, 16 Oct 2025 17:38:21 +0900 Subject: [PATCH] fix file upload handling to preserve array format for single files --- flight/net/Request.php | 11 ++++++--- tests/RequestTest.php | 51 +++++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/flight/net/Request.php b/flight/net/Request.php index 1397842..829356f 100644 --- a/flight/net/Request.php +++ b/flight/net/Request.php @@ -480,6 +480,10 @@ class Request $uploadedFiles = []; $correctedFilesArray = $this->reArrayFiles($this->files); foreach ($correctedFilesArray as $keyName => $files) { + // Check if original data was array format (files_name[] style) + $originalFile = $this->files->getData()[$keyName] ?? null; + $isArrayFormat = $originalFile && is_array($originalFile['name']); + foreach ($files as $file) { $UploadedFile = new UploadedFile( $file['name'], @@ -488,7 +492,9 @@ class Request $file['tmp_name'], $file['error'] ); - if (count($files) > 1) { + + // Always use array format if original data was array, regardless of count + if ($isArrayFormat) { $uploadedFiles[$keyName][] = $UploadedFile; } else { $uploadedFiles[$keyName] = $UploadedFile; @@ -508,10 +514,9 @@ class Request */ protected function reArrayFiles(Collection $filesCollection): array { - $fileArray = []; foreach ($filesCollection as $fileKeyName => $file) { - $isMulti = is_array($file['name']) === true && count($file['name']) > 1; + $isMulti = is_array($file['name']) === true ; $fileCount = $isMulti === true ? count($file['name']) : 1; $fileKeys = array_keys($file); diff --git a/tests/RequestTest.php b/tests/RequestTest.php index 5dc1f1a..38321ea 100644 --- a/tests/RequestTest.php +++ b/tests/RequestTest.php @@ -332,13 +332,20 @@ class RequestTest extends TestCase { // Arrange: Setup multiple file upload arrays $_FILES['files_1'] = [ - 'name' => ['file1.txt', 'file2.txt'], - 'type' => ['text/plain', 'text/plain'], - 'size' => [123, 456], - 'tmp_name' => ['/tmp/php123', '/tmp/php456'], - 'error' => [0, 0] + 'name' => 'file1.txt', + 'type' => 'text/plain', + 'size' => 123, + 'tmp_name' => '/tmp/php123', + 'error' => 0 ]; $_FILES['files_2'] = [ + 'name' => ['file2.txt'], + 'type' => ['text/plain'], + 'size' => [456], + 'tmp_name' => ['/tmp/php456'], + 'error' => [0] + ]; + $_FILES['files_3'] = [ 'name' => ['file3.txt', 'file4.txt'], 'type' => ['text/html', 'application/json'], 'size' => [789, 321], @@ -350,19 +357,33 @@ class RequestTest extends TestCase $request = new Request(); $uploadedFiles = $request->getUploadedFiles(); - // Assert: Verify first file group - $firstGroup = $uploadedFiles['files_1'] ?? []; - $this->assertCount(2, $firstGroup, 'First file group should contain 2 files'); + // Assert: Verify first file group (single file) + /* + + */ + $firstFile = $uploadedFiles['files_1'] ?? null; + $this->assertNotNull($firstFile, 'First file should exist'); + $this->assertUploadedFile($firstFile, 'file1.txt', 'text/plain', 123, '/tmp/php123', 0); + + // Assert: Verify second file group (array format with single file) + /* + + */ + $secondGroup = $uploadedFiles['files_2'] ?? []; + $this->assertCount(1, $secondGroup, 'Second file group should contain 1 file in array format'); - $this->assertUploadedFile($firstGroup[0], 'file1.txt', 'text/plain', 123, '/tmp/php123', 0); - $this->assertUploadedFile($firstGroup[1], 'file2.txt', 'text/plain', 456, '/tmp/php456', 0); + $this->assertUploadedFile($secondGroup[0], 'file2.txt', 'text/plain', 456, '/tmp/php456', 0); - // Assert: Verify second file group - $secondGroup = $uploadedFiles['files_2'] ?? []; - $this->assertCount(2, $secondGroup, 'Second file group should contain 2 files'); + // Assert: Verify third file group (multiple files) + /* + + + */ + $thirdGroup = $uploadedFiles['files_3'] ?? []; + $this->assertCount(2, $thirdGroup, 'Third file group should contain 2 files'); - $this->assertUploadedFile($secondGroup[0], 'file3.txt', 'text/html', 789, '/tmp/php789', 0); - $this->assertUploadedFile($secondGroup[1], 'file4.txt', 'application/json', 321, '/tmp/php321', 0); + $this->assertUploadedFile($thirdGroup[0], 'file3.txt', 'text/html', 789, '/tmp/php789', 0); + $this->assertUploadedFile($thirdGroup[1], 'file4.txt', 'application/json', 321, '/tmp/php321', 0); } /**