graphql-spring-boot上传二进制文件
我正在尝试上传GraphQL突变和图像作为应用程序/表单数据。GraphQL部分正在工作,但是我想“保存”上载的二进制文件并将路径添加到GraphQL数据。在createGraphQLContext中,我可以访问HttpServletRequest,但是(多个)部分为空。我使用带有嵌入式tomcat
8.5和提供的GraphQL Java工具的graphql-spring-boot-starter
这是我对/ graphql的Relay Modern调用
------WebKitFormBoundaryWBzwQyVX0TvBTIBDContent-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--
在我中,@Component public class MyGraphQLContextBuilder implements
GraphQLContextBuilder我有权HttpServletRequest
使用以下文件访问该文件:req.getPart( "file"
)
但是我在请求中的部分是空的 intellij调试器
我已将此添加到我的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启用多部分配置,但部分仍然为空。
@Configurationpublic 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支持公用FileUpload。为了使工作正常,您必须禁用Spring boots默认的multipart配置,例如:
在pom.xml中为commons-fileupload添加Maven依赖项
<dependency> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
Application.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
可从
突变的实现示例:
@Componentpublic 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;
}
}
以上是 graphql-spring-boot上传二进制文件 的全部内容, 来源链接: utcz.com/qa/409533.html