2016-06-21 77 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)

這爲我工作。

相關問題