graphql-spring-boot 上传二进制文件

2024-01-21

我正在尝试上传 GraphQL 突变和图像作为应用程序/表单数据。 GraphQL 部分正在工作,但我想“保存”上传的二进制文件并添加 GraphQL 数据的路径。在 createGraphQLContext 中,我可以访问 HttpServletRequest 但(多)部分是空的。 我用graphql-spring-boot-启动器 https://github.com/graphql-java/graphql-spring-boot带有嵌入式 tomcat 8.5 和提供的GraphQL Java 工具 https://github.com/graphql-java/graphql-java-tools

这是我对 /graphql 的中继现代调用

------WebKitFormBoundaryWBzwQyVX0TvBTIBD
Content-Disposition: form-data; name="query"

mutation CreateProjectMutation(
  $input: ProjectInput!
) {
  createProject(input: $input) {
    id
    name
  }
}

------WebKitFormBoundaryWBzwQyVX0TvBTIBD
Content-Disposition: form-data; name="variables"

{"input":{"name":"sdasas"}}
------WebKitFormBoundaryWBzwQyVX0TvBTIBD
Content-Disposition: form-data; name="file"; filename="51zvT5zy44L._SL500_AC_SS350_.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryWBzwQyVX0TvBTIBD--

In my @Component public class MyGraphQLContextBuilder implements GraphQLContextBuilder我可以访问HttpServletRequest并想使用访问该文件req.getPart( "file" )

但我的请求部分是空的英特尔调试器 https://i.stack.imgur.com/zMBXW.png

我已将其添加到我的 application.yml 中

spring:
    http:
      multipart:
        enabled: true
        file-size-threshold: 10MB
        location: /tmp
        max-file-size: 10MB
        max-request-size: 15MB
        resolve-lazily: false

并尝试了不同的@configuration来启用多部分配置,但部分仍然是空的。

@Configuration
public class MultipartConfig {

    @Bean
    public MultipartResolver multipartResolver() {
        StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
        return resolver;
    }

}

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyInitializer
        extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { MultipartConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/graphql" };
    }

    @Override
    protected void customizeRegistration(Dynamic registration) {

        //Parameters:-
        //   location - the directory location where files will be stored
        //   maxFileSize - the maximum size allowed for uploaded files
        //   maxRequestSize - the maximum size allowed for multipart/form-data requests
        //   fileSizeThreshold - the size threshold after which files will be written to disk
        MultipartConfigElement multipartConfig = new MultipartConfigElement("/tmp", 1048576,
                10485760, 0);
        registration.setMultipartConfig(multipartConfig);
    }
}

我不知道该怎么办。希望有人能帮助我。

谢谢。


Spring boot 的嵌入式 Tomcat 默认支持 Servlet 3.x 多部分。 GraphQL java servlet 支持公共文件上传。为了使事情正常工作,你必须禁用 Spring boot 默认的多部分配置,例如:

在pom.xml中添加commons-fileupload的maven依赖

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
    </dependency>

应用程序.yml

spring:
    servlet:
      multipart:
         enabled: false

Spring Boot应用程序类

@EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})

并在你的@Configuration中添加一个@Bean

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(100000);
    return multipartResolver;
}

现在您可以在 GraphQL 上下文中找到上传的多部分文件,因为它们会自动映射到:

environment -> context -> files

可从数据获取环境

以及突变的实现示例:

@Component
public class Mutation implements GraphQLMutationResolver {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UserService userService;

    @Autowired
    private ProjectRepository repository;

    @Autowired
    @Qualifier( value = "modeshape" )
    private StorageService storageService;

    @GraphQLField @GraphQLRelayMutation
    public ProjectItem createProject( CreateProjectInput input, DataFetchingEnvironment environment ) {
        Project project = new Project( input.getName() );
        project.setDescription( input.getDescription() );
        GraphQLContext context = environment.getContext();
        Optional<Map<String, List<FileItem>>> files = context.getFiles();
        files.ifPresent( keys -> {
            List<FileItem> file = keys.get( "file" );
            List<StorageService.FileInfo> storedFiles = file.stream().map( f -> storageService.store( f, "files", true ) ).collect( Collectors.toList() );
            project.setFile( storedFiles.get( 0 ).getUuid() );
        } );
        repository.save( project );
        return new ProjectItem( project );
    }
class CreateProjectInput {
    private String name;
    private String description;
    private String clientMutationId;

    @GraphQLField
    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription( String description ) {
        this.description = description;
    }

    @GraphQLField
    public String getClientMutationId() {
        return clientMutationId;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

graphql-spring-boot 上传二进制文件 的相关文章

随机推荐

  • 在 Colaboratory 中保存变量状态

    当我运行一个协作实验室中的 Python 脚本 https drive google com file d 1aHl XTDhs24XQ4qcdTgkk2cfF3iatpxj view usp sharing 它正在运行所有以前的代码单元
  • 在 Spring 服务类的所有实例之间共享一个 hashmap 实例

    我打算创建一个实时计数器 因此 一个用户可以增加特定键的计数器值 而另一个则通过 ajax 请求 在循环中或使用某种长轮询方法 获取更新的计数值 我将使用 spring 控制器 它将注入服务类我可以执行如下操作 还是有更好的方法 Servi
  • ASP.NET (OWIN) Identity:如何从 Web API 控制器获取 UserID?

    使用VS2013 RTW ASP NET MVC5 我看过很多有关如何在使用 ASP NET 身份时向 ApplicationUser 类 和表 添加属性的文档 但我还没有看到任何关于如何拥有一个单独的表 其内容通过外键映射到 Applic
  • 如何在类型级别用可选字段表示数据?

    我正在研究具有值 多态 可以是任何值 的控制流数据 而且它也could有一个验证器函数来检查该值是否仍然有效 并且could有一个 刷新值 的函数 返回具有新值的新数据 在 vanilla Haskell 中它可以看起来像这样 data M
  • 是否可以在 Xamarin.Forms 应用程序中引用 .NET Framework 库?

    我有一个 Xamarin Forms 项目 NET Standard 2 0 库 Microsoft NETCore UniversalWindowsPlatform 6 0 7 我想引用 NET Framework 4 6 1 库 我在
  • 本机 Nuget 中的 cdecl 和 stdcall 调用约定

    我正在尝试构建一个本机 nuget 包 它提供了调用约定的支点 为 x86 构建提供了具有 cdecl 和 stdcall 约定的 DLL 大多数用户更喜欢 cdecl 调用约定 但 P Invoke 这个库的 NET 用户出于各种原因更喜
  • 检索 Sharepoint 列表 C#

    我正在尝试检索 SharePoint 列表及其中的所有项目 但我似乎无法获取该列表 我可以正常连接到该网站 但是当我尝试检索列表时 出现 CollectionNotInitialized 错误 我以管理员身份登录并拥有完全控制权限 谁能帮我
  • 执行器完成服务?如果我们有 invokeAll 为什么还需要一个?

    如果我们使用一个执行者完成服务 http docs oracle com javase 8 docs api java util concurrent ExecutorCompletionService html我们可以提交一系列任务Cal
  • 更改searchView的光标颜色

    我知道这个问题已经发布了数百万次 但我无法为我的案例找到可行的解决方案 我需要更改 searchView 的光标颜色 我没有 searchView 的 xml 定义 我以编程方式使用它 这是我的代码 public boolean onCre
  • 每个索引节点有多少字节?

    我需要创建大量不是很大的文件 如 4kb 8kb 这在我的计算机上是不可能的 因为它会将所有 inode 占用高达 100 并且我无法创建更多文件 df i dev sda5 Filesystem Inodes IUsed IFree IU
  • 有没有办法以颜色将文本输出到 R 控制台

    我正在编写一个脚本 我想根据条件以不同的颜色将文本消息输出到控制台 例如 红色表示错误 蓝色表示警告等 我正在使用 RStudio 看看新的crayon package http cran r project org web package
  • Google 容器引擎 (Kubernetes):Websocket (Socket.io) 无法在多个副本上工作

    我是 Google 容器引擎 GKE 的新手 当运行于localhost它工作正常 但是当我使用 GKE 部署到生产环境时 出现了 websocket 错误 我的节点应用程序是用Hapi js and Socket io我的结构如下图所示
  • 如果可能的话,如何在 Objective-C 中声明结构的 typedef 枚举

    为了能够将职位限制为可用职位列表 我尝试了以下声明 typedef enum feedbackPositionMiddle 20 f 80 f feedBackPositionTop 20 f 40 f feedBackPositionBo
  • 在 nlme 中拟合数据的技巧?

    当我将数据放入 nlme 时 我第一次尝试从未成功 之后nlme fit model 我习惯于看到这样的事情 Error in nlme formula model mass SSbgf day w max t e t m random l
  • Cocoa - 如何在故事板模式下将视图的委托连接到文件的所有者?

    当我使用 xib 时 我通过接口生成器将视图的委托连接到文件的所有者 然后进入视图控制器的 h 文件并将其设置为委托以通过 但是在故事板模式下 没有文件的所有者对象 我正在使用一个名为 NinevehGL 的引擎 它简化了使用 openGL
  • Mysql phpMyadmin 超时问题

    我在Mysql中有一个非常大的数据库 我需要以这种方式维护它 例如 Innodb 中大约有 300 000 条记录 我将记录解析到数据库中 但现在我需要通过转换一些字段类型 例如将 long int 转换为tinyint 或其他类型 来完善
  • onActivityResult 不从 viewPager 片段调用

    您好 我在主片段内使用 viewPager 和 Fragmnets 我正在尝试从图库或相机将图像获取为位图 但是在选择照片和 startActivityForResult 后 它没有在 onActivityResult 中捕获 这是我调用
  • 奇怪的变量赋值

    我最近在研究在网上找到的一些代码 发现了这个 php 语法 有人可以解释一下这行代码发生了什么吗 在语句的该位置 哪些变量被赋予了哪些值 运算符的目的是什么 谢谢 拍 啊 我刚刚用 javascript 写了一篇关于这个习惯用法的博客文章
  • 如何在集成测试中一起使用@DataMongoTest和@SpringBootTest

    我正在尝试为我的其余应用程序之一编写集成测试用例 该应用程序在内部使用 mongodb 来保存数据 DataMongoTest SpringBootTest webEnvironment WebEnvironment RANDOM PORT
  • graphql-spring-boot 上传二进制文件

    我正在尝试上传 GraphQL 突变和图像作为应用程序 表单数据 GraphQL 部分正在工作 但我想 保存 上传的二进制文件并添加 GraphQL 数据的路径 在 createGraphQLContext 中 我可以访问 HttpServ