在GraphQL项目中实现文件上传功能一直是一个挑战。GraphQL本身并没有内置的文件上传机制,这给开发者带来了一些不便。为了解决这个问题,ecodev/graphql-upload库应运而生。它提供了一个PSR-15中间件,专门用于支持GraphQL中的文件上传,完美兼容webonyx/graphql-php。
安装
首先,你需要使用Composer安装这个库:
composer require ecodev/graphql-upload
配置为中间件
ecodev/graphql-upload遵循PSR-15标准,因此可以很容易地集成到任何支持PSR-15中间件的框架中。
Laminas Mezzio:
在config/routes.php中,你可以这样配置:
use Application\Action\GraphQLAction; use Mezzio\Helper\BodyParams\BodyParamsMiddleware; use GraphQL\Upload\UploadMiddleware; $app->post('/graphql', [ BodyParamsMiddleware::class, UploadMiddleware::class, // 关键所在 GraphQLAction::class, ], 'graphql');
其他框架:
对于其他支持PSR-15的框架,请参考相应的框架文档进行配置。如果你的框架不支持PSR-15中间件,你可能需要使用一些桥接方案,或者采用下面的直接使用方法。
直接使用
如果你不使用中间件,也可以直接调用该库:
<?php use GraphQL\Server\StandardServer; use GraphQL\Upload\UploadMiddleware; use Laminas\Diactoros\ServerRequestFactory; // 创建请求 (或者从框架中获取) $request = ServerRequestFactory::fromGlobals(); $request = $request->withParsedBody(json_decode($request->getBody()->getContents(), true)); // 处理上传的文件 $uploadMiddleware = new UploadMiddleware(); $request = $uploadMiddleware->processRequest($request); // 执行请求并发送响应 $server = new StandardServer(/* 你的配置 */); $result = $server->executePsrRequest($request); $server->getHelper()->sendResponse($result);
在Schema中使用
在GraphQL Schema中,你可以这样定义Mutation:
<?php use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use GraphQL\Type\Schema; use GraphQL\Upload\UploadType; use Psr\Http\Message\UploadedFileInterface; // 构建你的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']; // 处理文件 $file->moveTo('some/folder/in/my/project'); return 'Uploaded file was ' . $file->getClientFilename() . ' (' . $file->getClientMediaType() . ') with description: ' . $args['text']; }, ], ], ]), ]);
局限性
通过使用ecodev/graphql-upload,你可以轻松地在GraphQL应用中实现文件上传功能,避免了手动处理文件上传的复杂性,提高了开发效率。它是一个轻量级、易于集成的解决方案,值得你在GraphQL项目中尝试。
以上就是GraphQL文件上传难题如何解决?ecodev/graphql-upload来助力!的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号