0

我正在嘗試在我的Spring Boot應用程序中使用CommonsMultipartResolver。我不能使用StandardServletMultipartResolver,因爲我想處理異常(例如超出文件大小)。無法使用Spring Boot配置CommonsMultipartResolver 1.2.8

我建立了一個依賴commons-fileupload。我的春天配置是:

@Autowired 
    private MultipartProperties multipartProperties = new MultipartProperties(); 

    @Bean 
    public MultipartConfigElement multipartConfigElement() { 
     return this.multipartProperties.createMultipartConfig(); 
    } 

    @Bean 
    public MultipartResolver multipartResolver() { 
     LOG.debug("initializing MultipartResolver"); 
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
     return multipartResolver; 
    } 

    @Bean 
    public FilterRegistrationBean multipartFilterRegistrationBean() { 
     final MultipartFilter multipartFilter = new MultipartFilter(); 
     final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter); 
     multipartFilter.setMultipartResolverBeanName("multipartResolver"); 
     filterRegistrationBean.setOrder(OrderedHiddenHttpMethodFilter.DEFAULT_ORDER-1); 
     return filterRegistrationBean; 
    } 

當我設置了MultipartFilterHiddenHttpMethodFilter我得到一個IOException被前執行:

Caused by: java.io.IOException: Missing content for multipart request 
at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:491) 
at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:400) 
at org.eclipse.jetty.server.Request.getParts(Request.java:2139) 
at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:385) 
... 35 common frames omitted 

否則,我得到一個異常的部分參數不存在在請求中。

我相信我需要禁用servlet 3.0處理multipart請求,但我無法弄清楚如何在spring啓動時執行它。

+0

通過堆棧跟蹤來判斷,它看起來像您使用的Jetty,您沒有在任何地方提及過。爲了避免出現其他差異,您能否提供一個能夠重現問題的最小示例? –

回答

0

這件事是通過DefaultMultipartHttpServletRequest投擲getParameter異常這是所謂的HiddenHttpMethodFilter,造成的,因爲流是在MultipartFilter已經處理:

@Override 
protected void doFilterInternal(HttpServletRequest request, >HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 

    String paramValue = request.getParameter(this.methodParam); 
    if ("POST".equals(request.getMethod()) && >StringUtils.hasLength(paramValue)) { 
     String method = paramValue.toUpperCase(Locale.ENGLISH); 
     HttpServletRequest wrapper = new >HttpMethodRequestWrapper(request, method); 
     filterChain.doFilter(wrapper, response); 
    } 
    else { 
     filterChain.doFilter(request, response); 
    } 
} 

我對這個解決辦法是禁用MultipartAutoConfiguration,未定義MultipartConfigElement bean以禁用servlet 3.0多部分解析並且不使用MultipartFiler

現在的配置如下所示:

@Autowired 
private MultipartProperties multipartProperties = new MultipartProperties(); 

@Bean 
public MultipartResolver multipartResolver() { 
    LOG.debug("initializing MultipartResolver"); 
    MultipartConfigElement config = multipartProperties.createMultipartConfig(); 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
    multipartResolver.setResolveLazily(true); 
    multipartResolver.setMaxUploadSize(config.getMaxRequestSize()); 
    multipartResolver.setMaxUploadSizePerFile(config.getMaxFileSize()); 
    return multipartResolver; 
} 

現在甚至可以使用@ExceptionHandler建議當文件超過允許的最大大小返回正確的HTTP代碼。

-1

春天開機自動配置一個MultipartConfigElement,看到https://spring.io/guides/gs/uploading-files/剛剛從你的類路徑中刪除公地文件上傳

要知道,HiddenHttpMethodFilter需要如春文檔中闡明的多處理之後被執行,:

注意:由於其內部需要檢查POST主體參數,所以此過濾器需要在多部分POST請求的情況下在多部分處理後運行。因此,通常,在您的web.xml過濾器鏈中的HiddenHttpMethodFilter之前放置一個Spring MultipartFilter。

+0

我禁用了自動配置,並明確指出我不想使用'StandardServletMultipartResolver'。 – kpentchev

相關問題