[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.봄 부팅 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.이것은 까다 롭습니다. 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.@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.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.나는이 문제를 해결하기 위해 application.yml에 몇 줄을 썼다 :
나는이 문제를 해결하기 위해 application.yml에 몇 줄을 썼다 :
spring: http: multipart: max-file-size: 10MB max-request-size: 10MB
그것은 application.properties에서 작성했지만 yml에서는 작성하지 않은 경우 도움이되었습니다.
from https://stackoverflow.com/questions/35748022/multipart-file-maximum-size-exception-spring-boot-embbeded-tomcat by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 애플리케이션 시작시 H2 TCP 서버를 시작하는 방법은 무엇입니까? (0) | 2019.04.09 |
---|---|
[SPRING] Spring : @Value 주석을 사용하여 인라인 문자열 목록을 삽입하는 방법 [duplicate] (0) | 2019.04.08 |
[SPRING] TestNG 및 Spring 3 (0) | 2019.04.08 |
[SPRING] Repository에 대한 특정 DataSource를 설정하는 방법? (0) | 2019.04.08 |
[SPRING] CrudRepository findOne ()과 JpaRepository getOne ()의 차이점 (0) | 2019.04.08 |