GraphQL文件上传难题如何解决?ecodev/graphql-upload来助力!

GraphQL文件上传难题如何解决?ecodev/graphql-upload来助力!
最新回答
画心骨

2022-08-18 21:03:42

使用ecodev/graphql-upload库可以高效解决GraphQL文件上传难题。该库通过提供PSR-15中间件,兼容webonyx/graphql-php,简化了文件上传流程。以下是具体解决方案:

1. 安装库

通过Composer安装依赖:

composer require ecodev/graphql-upload2. 配置中间件Laminas Mezzio框架

在config/routes.php中配置中间件链:

use ApplicationActionGraphQLAction;use MezzioHelperBodyParamsBodyParamsMiddleware;use GraphQLUploadUploadMiddleware;$app->post('/graphql', [ BodyParamsMiddleware::class, UploadMiddleware::class, // 关键中间件 GraphQLAction::class,], 'graphql');其他PSR-15兼容框架

参考框架文档配置中间件。若框架不支持PSR-15,需使用桥接方案或直接调用库。

3. 直接使用(无中间件场景)

手动处理请求和文件上传:

use GraphQLServerStandardServer;use GraphQLUploadUploadMiddleware;use LaminasDiactorosServerRequestFactory;// 创建请求(或从框架获取)$request = ServerRequestFactory::fromGlobals();$request = $request->withParsedBody(json_decode($request->getBody()->getContents(), true));// 处理上传文件$uploadMiddleware = new UploadMiddleware();$request = $uploadMiddleware->processRequest($request);// 执行GraphQL请求$server = new StandardServer(/* 配置 */);$result = $server->executePsrRequest($request);$server->getHelper()->sendResponse($result);4. 在Schema中定义上传字段

在GraphQL Schema中,使用UploadType定义文件上传参数:

use GraphQLTypeDefinitionObjectType;use GraphQLTypeDefinitionType;use GraphQLTypeSchema;use GraphQLUploadUploadType;use PsrHttpMessageUploadedFileInterface;$schema = new Schema([ 'query' => new ObjectType([...]), '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->getClientFilename(); }, ], ], ]),]);5. 关键注意事项
  • PSR-7请求限制:当前库仅支持PSR-7标准的HTTP请求。
  • 文件处理:在resolve函数中,需通过UploadedFileInterface的moveTo()方法保存文件。
  • 框架兼容性:优先使用中间件集成;若框架不支持PSR-15,需手动处理请求。
优势总结
  • 简化流程:避免手动解析多部分表单数据。
  • 标准化集成:遵循PSR-15/PSR-7标准,适配主流框架。
  • 轻量高效:核心功能聚焦,开销低。

通过上述步骤,可快速在GraphQL项目中实现可靠的文件上传功能。