I would like to implement upload handler method in my Spring Boot app. I want to use CommonsMultipartResolver instead of StandardServletMultipartResolver. I have the the following problem: 
My controller method parameter (file) is always set to null. I saw in java docs of HiddenHttpMethodFilter: 
This filter needs to run after multipart processing in case of a multipart POST request, due to its inherent need for checking a POST body parameter. 
I tried to set order for the multipartFilter bean but it did not help. When I debug, I see that HiddenHttpMethodFilter is always called before MultipartFilter.  I am using Spring Boot version 1.3.0.RELEASE and Java based config. How can I set the order that   HiddenHttpMethodFilter comes after 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();
}
If I modify the method to include Request param like below:
@RequestParam(name = "file", required = true) MultipartFile file
It throws an exception: 'Required MultipartFile parameter 'file' is not present'.
If I use StandardServletMultipartResolver, everything works as expected.
In Spring Boot to use CommonsMultipartResolver you need to disable MultipartAutoConfiguration by adding following annotation to your configuration:
@EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})
My multipart resolver bean:
 @Bean
 public MultipartResolver multipartResolver() {
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
     multipartResolver.setMaxUploadSize(5 * 1024 * 1024);
     return multipartResolver;
 }
                        I think they have the resolved the issue in Spring-Boot 1.4.2.RELEASE version:
@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;
}
You also need to exclude Spring-Boot's MultipartAutoConfiguration.class
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
This worked for me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With