0

스프링 부트 응용 프로그램에 CommonsMultipartResolver을 사용하려고합니다. 예외 (예 : 파일 크기 초과)를 처리하려는 경우 StandardServletMultipartResolver을 사용할 수 없습니다.Spring Boot 1.2.8으로 CommonsMultipartResolver를 구성 할 수 없습니다.

종속성을 commons-fileupload으로 설정했습니다. 내 스프링 구성은 다음 HiddenHttpMethodFilter은 내가 IOException 얻을에

@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을 설정하기 전에 실행되는 그렇지 않으면

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 

을, 나는 부분 매개 변수가 존재하지 않는 것을 예외가 요청에.

서블릿 3.0에서 멀티 파트 요청 처리를 사용하지 않아야한다고 생각하지만 스프링 부팅시 어떻게해야하는지 알 수 없습니다.

+0

스택 추적으로 판단하면 어디에서도 언급하지 않은 Jetty를 사용하는 것처럼 보입니다. 다른 불일치를 피하기 위해 문제를 재현하는 최소한의 예를 제공 할 수 있습니까? –

답변

0

문제는, HiddenHttpMethodFilter에 의해 호출 된 getParameter에 예외를 던지는 DefaultMultipartHttpServletRequest에 의해 발생 :이 내 솔루션을 사용하지 않도록하는 것이 었습니다

@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 multipart 파싱을 비활성화하고 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; 
} 

이 지금은 파일이 허용되는 최대 크기를 초과 할 때 올바른 HTTP 코드를 반환하는 @ExceptionHandler 조언을 사용하는 것도 가능하다.

-1

봄 부트 자동차가 MultipartConfigElement를 구성, HiddenHttpMethodFilter 봄 문서에 명시된 바와 같이, 다중 처리 후에 실행해야한다는,

이주의 그냥 클래스 경로에서 평민 - 파일 업로드를 제거 https://spring.io/guides/gs/uploading-files/를 참조하십시오

참고 :이 필터는 멀티 파트 POST 요청의 경우 멀티 바디 처리 후에 실행해야합니다. POST 본문 매개 변수를 확인해야하기 때문입니다. 따라서 일반적으로 web.xml 필터 체인에이 HiddenHttpMethodFilter 앞에 Spring MultipartFilter를 두십시오. 스트림이 이미 MultipartFilter에서 처리했기 때문에

+0

자동 설정을 비활성화하고 'StandardServletMultipartResolver'를 사용하고 싶지 않다고 명시 적으로 말했습니다. – kpentchev