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. 关键注意事项通过上述步骤,可快速在GraphQL项目中实现可靠的文件上传功能。