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

WBOY
发布: 2025-06-18 12:56:13
原创
373人浏览过

在GraphQL项目中实现文件上传功能一直是一个挑战。GraphQL本身并没有内置的文件上传机制,这给开发者带来了一些不便。为了解决这个问题,ecodev/graphql-upload库应运而生。它提供了一个PSR-15中间件,专门用于支持GraphQL中的文件上传,完美兼容webonyx/graphql-php。

composer在线学习地址:学习地址

安装

首先,你需要使用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'];
                },
            ],
        ],
    ]),
]);
登录后复制

局限性

  • 目前只支持PSR-7请求。

通过使用ecodev/graphql-upload,你可以轻松地在GraphQL应用中实现文件上传功能,避免了手动处理文件上传的复杂性,提高了开发效率。它是一个轻量级、易于集成的解决方案,值得你在GraphQL项目中尝试。

以上就是GraphQL文件上传难题如何解决?ecodev/graphql-upload来助力!的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号