fix file upload handling to preserve array format for single files

pull/664/head
KnifeLemon 3 weeks ago
parent f0bd5dda81
commit ca46fd041d

@ -480,6 +480,10 @@ class Request
$uploadedFiles = []; $uploadedFiles = [];
$correctedFilesArray = $this->reArrayFiles($this->files); $correctedFilesArray = $this->reArrayFiles($this->files);
foreach ($correctedFilesArray as $keyName => $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) { foreach ($files as $file) {
$UploadedFile = new UploadedFile( $UploadedFile = new UploadedFile(
$file['name'], $file['name'],
@ -488,7 +492,9 @@ class Request
$file['tmp_name'], $file['tmp_name'],
$file['error'] $file['error']
); );
if (count($files) > 1) {
// Always use array format if original data was array, regardless of count
if ($isArrayFormat) {
$uploadedFiles[$keyName][] = $UploadedFile; $uploadedFiles[$keyName][] = $UploadedFile;
} else { } else {
$uploadedFiles[$keyName] = $UploadedFile; $uploadedFiles[$keyName] = $UploadedFile;
@ -508,10 +514,9 @@ class Request
*/ */
protected function reArrayFiles(Collection $filesCollection): array protected function reArrayFiles(Collection $filesCollection): array
{ {
$fileArray = []; $fileArray = [];
foreach ($filesCollection as $fileKeyName => $file) { 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; $fileCount = $isMulti === true ? count($file['name']) : 1;
$fileKeys = array_keys($file); $fileKeys = array_keys($file);

@ -332,13 +332,20 @@ class RequestTest extends TestCase
{ {
// Arrange: Setup multiple file upload arrays // Arrange: Setup multiple file upload arrays
$_FILES['files_1'] = [ $_FILES['files_1'] = [
'name' => ['file1.txt', 'file2.txt'], 'name' => 'file1.txt',
'type' => ['text/plain', 'text/plain'], 'type' => 'text/plain',
'size' => [123, 456], 'size' => 123,
'tmp_name' => ['/tmp/php123', '/tmp/php456'], 'tmp_name' => '/tmp/php123',
'error' => [0, 0] 'error' => 0
]; ];
$_FILES['files_2'] = [ $_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'], 'name' => ['file3.txt', 'file4.txt'],
'type' => ['text/html', 'application/json'], 'type' => ['text/html', 'application/json'],
'size' => [789, 321], 'size' => [789, 321],
@ -350,19 +357,33 @@ class RequestTest extends TestCase
$request = new Request(); $request = new Request();
$uploadedFiles = $request->getUploadedFiles(); $uploadedFiles = $request->getUploadedFiles();
// Assert: Verify first file group // Assert: Verify first file group (single file)
$firstGroup = $uploadedFiles['files_1'] ?? []; /*
$this->assertCount(2, $firstGroup, 'First file group should contain 2 files'); <input type="file" name="files_1">
*/
$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)
/*
<input type="file" name="files_2[]">
*/
$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($secondGroup[0], 'file2.txt', 'text/plain', 456, '/tmp/php456', 0);
$this->assertUploadedFile($firstGroup[1], 'file2.txt', 'text/plain', 456, '/tmp/php456', 0);
// Assert: Verify second file group // Assert: Verify third file group (multiple files)
$secondGroup = $uploadedFiles['files_2'] ?? []; /*
$this->assertCount(2, $secondGroup, 'Second file group should contain 2 files'); <input type="file" name="files_3[]">
<input type="file" name="files_3[]">
*/
$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($thirdGroup[0], 'file3.txt', 'text/html', 789, '/tmp/php789', 0);
$this->assertUploadedFile($secondGroup[1], 'file4.txt', 'application/json', 321, '/tmp/php321', 0); $this->assertUploadedFile($thirdGroup[1], 'file4.txt', 'application/json', 321, '/tmp/php321', 0);
} }
/** /**

Loading…
Cancel
Save