Summary
Request currently loses uploaded files when multiple top-level file fields are provided in one multipart request (for example avatar + resume).
Current behavior
Only one top-level file key is processed and stored.
Expected behavior
All top-level file fields should be parsed and available via hasFile() / getFile().
Where this happens
src/Http/Traits/Request/File.php
handleFiles(array $files) reads key($files) and processes only that single field.
- It returns without iterating all top-level keys.
src/Http/Request.php
- Real request lifecycle path is affected:
populateFromServer() calls setUploadedFiles($rawInputFiles)
setUploadedFiles() merges handleFiles($_FILES)
- Because
handleFiles($_FILES) processes only one top-level key, real HTTP multipart uploads can also lose sibling file fields.
src/Http/Traits/Request/Internal.php
create() calls setUploadedFiles($this->handleFiles($files)), so internal test request creation is also affected.
Reproduction
Use either:
- real multipart request with multiple top-level file inputs (
avatar, resume), or
Request::create() with the same file structure.
Observed: only one field remains available afterward.
Regression test
Added failing test:
tests/Unit/Http/Traits/Request/HttpRequestFileTest.php
testCreateWithMultipleTopLevelFileFields()
Command:
php vendor/bin/phpunit tests/Unit/Http/Traits/Request/HttpRequestFileTest.php --filter testCreateWithMultipleTopLevelFileFields
Observed result:
- Fails with
Failed asserting that false is true.
Impact
High correctness impact: forms with multiple independent file inputs are parsed incorrectly, causing silent file loss.
Proposed fix
Update handleFiles() to iterate through all top-level file keys and build a merged uploaded-files map for both:
- single-file fields
- multi-file fields (
name as array)
Summary
Requestcurrently loses uploaded files when multiple top-level file fields are provided in one multipart request (for exampleavatar+resume).Current behavior
Only one top-level file key is processed and stored.
Expected behavior
All top-level file fields should be parsed and available via
hasFile()/getFile().Where this happens
src/Http/Traits/Request/File.phphandleFiles(array $files)readskey($files)and processes only that single field.src/Http/Request.phppopulateFromServer()callssetUploadedFiles($rawInputFiles)setUploadedFiles()mergeshandleFiles($_FILES)handleFiles($_FILES)processes only one top-level key, real HTTP multipart uploads can also lose sibling file fields.src/Http/Traits/Request/Internal.phpcreate()callssetUploadedFiles($this->handleFiles($files)), so internal test request creation is also affected.Reproduction
Use either:
avatar,resume), orRequest::create()with the same file structure.Observed: only one field remains available afterward.
Regression test
Added failing test:
tests/Unit/Http/Traits/Request/HttpRequestFileTest.phptestCreateWithMultipleTopLevelFileFields()Command:
Observed result:
Failed asserting that false is true.Impact
High correctness impact: forms with multiple independent file inputs are parsed incorrectly, causing silent file loss.
Proposed fix
Update
handleFiles()to iterate through all top-level file keys and build a merged uploaded-files map for both:nameas array)