在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 ApplicationActionGraphQLAction; use MezzioHelperBodyParamsBodyParamsMiddleware; use GraphQLUploadUploadMiddleware; $app->post('/graphql', [ BodyParamsMiddleware::class, UploadMiddleware::class, // 關鍵所在 GraphQLAction::class, ], 'graphql');
-
其他框架:
對于其他支持PSR-15的框架,請參考相應的框架文檔進行配置。如果你的框架不支持PSR-15中間件,你可能需要使用一些橋接方案,或者采用下面的直接使用方法。
直接使用
如果你不使用中間件,也可以直接調用該庫:
<?php 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); // 執行請求并發送響應 $server = new StandardServer(/* 你的配置 */); $result = $server->executePsrRequest($request); $server->getHelper()->sendResponse($result);
在Schema中使用
在GraphQL Schema中,你可以這樣定義Mutation:
<?php use GraphQLTypeDefinitionObjectType; use GraphQLTypeDefinitionType; use GraphQLTypeSchema; use GraphQLUploadUploadType; use PsrHttpMessageUploadedFileInterface; // 構建你的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']; }, ], ], ]), ]);
局限性
- 目前只支持PSR-7請求。
通過使用ecodev/graphql-upload,你可以輕松地在GraphQL應用中實現文件上傳功能,避免了手動處理文件上傳的復雜性,提高了開發效率。它是一個輕量級、易于集成的解決方案,值得你在GraphQL項目中嘗試。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END