2016-06-21 49 views
1

我想在我的Spring Boot应用程序中实现上传处理程序方法。我想使用CommonsMultipartResolver而不是StandardServletMultipartResolver。我有以下问题:当我在Spring Boot应用程序中使用CommonsMultipartResolver时,MultipartFile为null

我的控制器方法参数(文件)始终设置为空。我在HiddenHttpMethodFilter的java文档中看到: 由于其内部需要检查POST主体参数,所以此过滤器在多部分POST请求的情况下需要在多部分处理后运行。

我试图设置multipartFilter bean的顺序,但它没有帮助。当我调试时,我看到HiddenHttpMethodFilter总是在MultipartFilter之前调用。我正在使用Spring Boot版本1.3.0.RELEASE和基于Java的配置。我该如何设置HiddenHttpMethodFilter之后的订单MultipartFilter

@Bean(name = "multipartResolver") 
public CommonsMultipartResolver multipartResolver() { 
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();   
    resolver.setMaxUploadSizePerFile(52428800); 
    return resolver; 
} 

@Bean 
@Order(0) 
public MultipartFilter multipartFilter() { 
     MultipartFilter multipartFilter = new MultipartFilter(); 
    multipartFilter.setMultipartResolverBeanName("multipartResolver"); 
    return multipartFilter; 
} 

@RequestMapping(value = "/{userId}", method = RequestMethod.POST) 
@ResponseBody 
public FileTransport create(@PathVariable("userId") Long userId, 
     MultipartFile file) throws IOException { 
    //return fileService.create(userId, file); 
    return new FileTransport(); 
} 

如果我修改的方法,包括像下面请PARAM:

@RequestParam(NAME = “文件”,要求= TRUE)MultipartFile文件

它抛出一个异常:“必MultipartFile参数'文件'不存在'。

如果我使用StandardServletMultipartResolver,一切都按预期工作。

+1

正如[在GitHub上讨论](https://github.com/spring-projects/spring-boot/issues/2958#issuecomment-227536841),您的'MultipartFilter'的顺序是错误的。它需要小于-10000的'HiddenHttpMethodFilter'的顺序。如果这没有帮助,你能提供一个[最小,完整,可验证的例子](http://stackoverflow.com/help/mcve)? –

+0

@AndyWilkinson HiddenHttpMethodFilter的顺序不是-10000,而是HIGHEST_PRECEDENCE + 10。但是,即使你将MultipartFilter设置为超前,上传失败,这次使用'java.io.IOException:缺少多部分请求的内容 \t at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:390 )'。 CommonsMultipartResolver是否与Spring Boot兼容? – kpentchev

+0

@AndyWilkinson弹簧启动版本是1.2.8。 – kpentchev

回答

4

在春季启动使用是CommonsMultipartResolver你需要通过添加以下注释到配置禁用MultipartAutoConfiguration:

@EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class} 

我multipart解析器豆:

@Bean 
public MultipartResolver multipartResolver() { 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
    multipartResolver.setMaxUploadSize(5 * 1024 * 1024); 
    return multipartResolver; 
} 
+0

添加此排除对我也有效。 –

2

我认为他们找到了解决问题in Spring-Boot 1.4.2.RELEASE

@Bean 
public CommonsMultipartResolver multipartResolver() { 
    CommonsMultipartResolver multipart = new CommonsMultipartResolver(); 
    multipart.setMaxUploadSize(3 * 1024 * 1024); 
    return multipart; 
} 

@Bean 
@Order(0) 
public MultipartFilter multipartFilter() { 
    MultipartFilter multipartFilter = new MultipartFilter(); 
    multipartFilter.setMultipartResolverBeanName("multipartResolver"); 
    return multipartFilter; 
} 

您还需要排除春节-Boot的MulipartAutoConfiguration.class

@EnableAutoConfiguration(排除= {} MultipartAutoConfiguration.class)

这为我工作。

相关问题