我正在尝试在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中执行此操作。
答案 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之前。