복붙노트

[SPRING] 다중 파일 파일 최대 크기 예외 - 스프링 부트 내장 된 바람둥이

SPRING

다중 파일 파일 최대 크기 예외 - 스프링 부트 내장 된 바람둥이

최대 파일 크기를로 설정했습니다.

multipart.maxFileSize: 1mb
multipart.maxRequestSize: 1mb

이것은 내 컨트롤러 다.

@RequestMapping(method=RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
@Secured(Privileges.CAN_USER_READ)
public void create(@RequestParam("file")final MultipartFile file,Principal principal) throws IllegalStateException, IOException,MultipartException{

    medicalHistoryService.create(new MedicalHistory(file));
}

이것은 오류 메시지입니다.

2016-03-03 13:48:24.560  WARN 4992 --- [nio-8080-exec-1] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576)

2016-03-03 13:48:25.545  WARN 4992 --- [nio-8080-exec-2] h.c.w.RestResponseEntityExceptionHandler : Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (9288401) exceeds the configured maximum (1048576)

크기가 큰 파일 요청 후 최종 결과는 페이지로드 문제입니다. 스택 트레이스에서 다른 에러가 발생하지 않기 때문에 나는 실제로 어떤 일이 벌어지고있는 지 파악하고 있습니다. 오, 그래, 내가 필터를 등록, ErrorController에서 예외 처리와 같은 많은 다른 솔루션을 시도했다. 때마다 나는 같은 결과로 끝날 것이다 - 서버 충돌.

EDIT 2

내 예외 처리 클래스 :

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends 
ResponseEntityExceptionHandler{

// 413 MultipartException - file size too big 
@ExceptionHandler({MultipartException.class,FileSizeLimitExceededException.class,java.lang.IllegalStateException.class})
public ResponseEntity<Object> handleSizeExceededException(final WebRequest request, final MultipartException ex) {
    //log.warn("413 Status Code. File size too large {}", ex.getMessage());
    log.warn(ex.getMessage());
    final ApiError apiError = message(HttpStatus.PAYLOAD_TOO_LARGE, ex);
    return handleExceptionInternal(ex, apiError, new HttpHeaders(), HttpStatus.PAYLOAD_TOO_LARGE, request);
}

}

해결법

  1. ==============================

    1.봄 부팅 2에서 시작되었습니다.

    봄 부팅 2에서 시작되었습니다.

    spring.servlet.multipart.max-file-size = 128KB spring.servlet.multipart.max-request-size = 128KB

    문서보기

    스프링 부트 1.x

    속성은 다음과 같아야합니다. spring.http.multipart.max-file-size = 128KB spring.http.multipart.max-request-size = 128KB

    스프링 부트 가이드 참조

  2. ==============================

    2.이것은 까다 롭습니다. Tomcat 속성 MaxSwallowSize가이 문제를 일으켰습니다. 분명히 Tomcat의 최신 버전 중 하나에서 소개되었습니다. 그 뒤에있는 전체적인 생각은 Tomcat이 요청이 거부 될 것이라는 것을 깨달았을 때, 디폴트보다 2Mb 이상 높은 연결을 종료하기 위해서였습니다 (적어도 이것은 나의 해석이었습니다). 이 속성을 단순 재정 의하여하면 문제가 해결됩니다. 이것이 완벽한 해결책이 아니라는 것을 알지만, 단지 연결을 종료하는 것보다 훨씬 낫습니다.

    이것은 까다 롭습니다. Tomcat 속성 MaxSwallowSize가이 문제를 일으켰습니다. 분명히 Tomcat의 최신 버전 중 하나에서 소개되었습니다. 그 뒤에있는 전체적인 생각은 Tomcat이 요청이 거부 될 것이라는 것을 깨달았을 때, 디폴트보다 2Mb 이상 높은 연결을 종료하기 위해서였습니다 (적어도 이것은 나의 해석이었습니다). 이 속성을 단순 재정 의하여하면 문제가 해결됩니다. 이것이 완벽한 해결책이 아니라는 것을 알지만, 단지 연결을 종료하는 것보다 훨씬 낫습니다.

    @Bean
    public TomcatEmbeddedServletContainerFactory containerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
         factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
             ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
         });
         return factory;
    }
    
  3. ==============================

    3.@SeaBiscuit이 정답을 제공 했으므로 스프링 부트 2.0.0.RELEASE org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory 클래스가 제거되고 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory 클래스로 대체되었습니다. 따라서 새로운 Spring 부트 2.0.0 코드는

    @SeaBiscuit이 정답을 제공 했으므로 스프링 부트 2.0.0.RELEASE org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory 클래스가 제거되고 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory 클래스로 대체되었습니다. 따라서 새로운 Spring 부트 2.0.0 코드는

    @Bean
    public TomcatServletWebServerFactory containerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        });
        return factory;
    }
    

    Spring 부트 2.0.0에서 최대 파일 업로드 크기를 설정하는 데 어려움이 있다면 원하는 파일 크기가있는 'application.propertise'파일 안에 'MB 's'코드를 넣으십시오.

    ## Image upload limitation properties
    spring.servlet.multipart.max-file-size=3MB
    spring.servlet.multipart.max-request-size=3MB
    
  4. ==============================

    4.spring 부트 버전 -2.0.1.RELEASE에 대해서는 application.properties에 아래 줄을 추가하십시오.

    spring 부트 버전 -2.0.1.RELEASE에 대해서는 application.properties에 아래 줄을 추가하십시오.

    spring.servlet.multipart.max-file-size=128MB
    spring.servlet.multipart.max-request-size=128MB
    spring.servlet.multipart.enabled=true
    

    이 문제가 해결되었습니다.

  5. ==============================

    5.나는이 문제를 해결하기 위해 application.yml에 몇 줄을 썼다 :

    나는이 문제를 해결하기 위해 application.yml에 몇 줄을 썼다 :

    spring:
        http:
            multipart:
                max-file-size: 10MB
                max-request-size: 10MB
    

    그것은 application.properties에서 작성했지만 yml에서는 작성하지 않은 경우 도움이되었습니다.

  6. from https://stackoverflow.com/questions/35748022/multipart-file-maximum-size-exception-spring-boot-embbeded-tomcat by cc-by-sa and MIT license