ecodev/graphql-upload

A middleware to support file uploads in GraphQL

Package info

github.com/Ecodev/graphql-upload

pkg:composer/ecodev/graphql-upload

Statistics

Installs: 2 260 845

Dependents: 13

Suggesters: 2

Stars: 90

Open Issues: 3

8.0.1 2025-12-30 11:29 UTC

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT c8f64d971125f1fe53acd67f944af1bfea9459e5

apiuploadmiddlewaremultipartgraphql


README

👁 Build Status
👁 Total Downloads
👁 Latest Stable Version
👁 License

A PSR-15 middleware to support file uploads in GraphQL. It implements the multipart request specification for webonyx/graphql-php.

Quick start

Install the library via composer:

composer require ecodev/graphql-upload

Configure as middleware

In Laminas Mezzio, it would typically be in config/routes.php something like:

use Application\Action\GraphQLAction;
use Mezzio\Helper\BodyParams\BodyParamsMiddleware;
use GraphQL\Upload\UploadMiddleware;

$app->post('/graphql', [
 BodyParamsMiddleware::class, 
 UploadMiddleware::class, // This is the magic
 GraphQLAction::class,
], 'graphql');

Other frameworks

This lib is an implementation of PSR-15, so it can be used with any framework supporting PSR-15. For specific configuration instructions, refer to your framework documentation.

If your framework does not support PSR-15 middleware, you will probably need some kind of bridge. Again, refer to your framework for specific instructions.

Usage in schema

Then you can start using in your mutations like so:

<?php

use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Schema;
use GraphQL\Upload\UploadType;
use Psr\Http\Message\UploadedFileInterface;

// Build your Schema
$schema = new Schema([
 'query' => new ObjectType([
 'name' => 'Query',
 'fields' => [],
 ]),
 'mutation' => new ObjectType([
 'name' => 'Mutation',
 'fields' => [
 'testUpload' => [
 'type' => Type::string(),
 'args' => [
 'text' => Type::string(),
 'file' => new UploadType(),
 ],
 'resolve' => function ($root, array $args): string {
 /** @var UploadedFileInterface $file */
 $file = $args['file'];

 // Do something with the file
 $file->moveTo('some/folder/in/my/project');

 return 'Uploaded file was ' . $file->getClientFilename() . ' (' . $file->getClientMediaType() . ') with description: ' . $args['text'];
 },
 ],
 ],
 ]),
]);

Limitations

  • It only works with PSR-7 requests. If you were not using PSR-7 yet, laminas-diactoros is one of many implementation that could be used to create PSR-7 requests.