Skip to content

Request file handling drops multiple top-level uploaded file fields #526

Description

@armanist

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

  1. 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.
  1. 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.
  1. 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions