无法使用Spring Boot 1.2.8配置CommonsMultipartResolver

时间:2016-08-17 14:14:46

标签: spring spring-boot multipartform-data servlet-3.0 apache-commons-fileupload

我正在尝试在Spring Boot应用程序中使用CommonsMultipartResolver。我无法使用StandardServletMultipartResolver,因为我想处理异常(例如超出文件大小)。

我已经设置了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;
    }

当我设置MultipartFilter之前要执行的HiddenHttpMethodFilter时,我得到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

否则,我得到一个例外,即请求中没有part参数。

我相信我需要禁用servlet 3.0处理多部分请求,但我无法弄清楚如何在spring boot中执行此操作。

2 个答案:

答案 0 :(得分:0)

问题原因是DefaultMultipartHttpServletRequest在[{1}}上抛出了由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 bean以禁用servlet 3.0多部分解析而不使用MultipartConfigElement

现在配置如下所示:

MultipartFiler

现在甚至可以使用@ExceptionHandler建议在文件超过允许的最大大小时返回正确的HTTP代码。

答案 1 :(得分:-1)

Spring boot auto配置一个MultipartConfigElement,参见https://spring.io/guides/gs/uploading-files/只需从类路径中删除commons-fileupload

请注意,HiddenHttpMethodFilter需要在多部分处理后执行,如spring docs中所述:

  

注意:由于需要检查POST正文参数,因此在多部分POST请求的情况下,此过滤器需要在多部分处理之后运行。通常,在您的web.xml过滤器链中将Spring MultipartFilter放在此HiddenHttpMethodFilter之前。