1. 개요
Spring 프레임 워크에서 애플리케이션이 구성에 지정된 특정 임계 값을 초과하는 파일을 업로드하려고하면 MaxUploadSizeExceededException 이 발생합니다.
이 사용방법(예제)에서는 최대 업로드 크기를 지정하는 방법을 살펴 봅니다. 그런 다음 간단한 파일 업로드 컨트롤러를 보여주고이 예외를 처리하는 다양한 방법에 대해 설명합니다.
2. 최대 업로드 크기 설정
기본적으로 업로드 할 수있는 파일의 크기에는 제한이 없습니다. 최대 업로드 크기를 설정하려면 MultipartResolver 유형의 Bean을 선언해야합니다 .
파일 크기를 5MB로 제한하는 예를 살펴 보겠습니다.
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver
= new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(5242880);
return multipartResolver;
}
3. 파일 업로드 컨트롤러
다음으로 파일의 서버에 업로드 및 저장을 처리하는 컨트롤러 메서드를 정의 해 보겠습니다.
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(MultipartFile file) throws IOException {
ModelAndView modelAndView = new ModelAndView("file");
InputStream in = file.getInputStream();
File currDir = new File(".");
String path = currDir.getAbsolutePath();
FileOutputStream f = new FileOutputStream(
path.substring(0, path.length()-1)+ file.getOriginalFilename());
int ch = 0;
while ((ch = in.read()) != -1) {
f.write(ch);
}
f.flush();
f.close();
modelAndView.getModel().put("message", "File uploaded successfully!");
return modelAndView;
}
사용자가 크기가 5MB보다 큰 파일을 업로드하려고하면 애플리케이션에서 MaxUploadSizeExceededException 유형의 예외가 발생 합니다.
4. MaxUploadSizeExceededException 처리
이 예외를 처리하기 위해 컨트롤러가 HandlerExceptionResolver 인터페이스를 구현하도록 하거나 @ControllerAdvice 어노테이션이 달린 클래스를 생성 할 수 있습니다 .
4.1. HandlerExceptionResolver 구현
HandlerExceptionResolver의 인터페이스라는 메소드를 선언 resolveException () 다른 유형의 예외를 처리 할 수 있습니다.
확인 된 예외가 MaxUploadSizeExceededException 유형 인 경우 메시지를 표시하도록 resolveException () 메서드를 재정의 해 보겠습니다 .
@Override
public ModelAndView resolveException(
HttpServletRequest request,
HttpServletResponse response,
Object object,
Exception exc) {
ModelAndView modelAndView = new ModelAndView("file");
if (exc instanceof MaxUploadSizeExceededException) {
modelAndView.getModel().put("message", "File size exceeds limit!");
}
return modelAndView;
}
4.2. Controller Advice Interceptor 생성
컨트롤러 자체가 아닌 인터셉터를 통해 예외를 처리하면 몇 가지 이점이 있습니다. 하나는 동일한 예외 처리 로직을 여러 컨트롤러에 적용 할 수 있다는 것입니다.
또 다른 하나는 처리하려는 예외 만 대상으로하는 메서드를 생성하여, 어떤 유형의 예외가 발생했는지 확인 하기 위해 instanceof 를 사용하지 않고도 프레임 워크가 예외 처리를 위임 할 수 있도록 할 수 있다는 것입니다.
@ControllerAdvice
public class FileUploadExceptionAdvice {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ModelAndView handleMaxSizeException(
MaxUploadSizeExceededException exc,
HttpServletRequest request,
HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView("file");
modelAndView.getModel().put("message", "File too large!");
return modelAndView;
}
}
5. Tomcat 구성
Tomcat 서버 버전 7 이상에 배포하는 경우 설정하거나 변경해야 할 수있는 maxSwallowSize 라는 구성 속성이 있습니다.
이 속성은 서버가 파일을 무시할 것을 알고있을 때 Tomcat이 클라이언트의 업로드를 위해 "허용"하는 최대 바이트 수를 지정합니다.
속성의 기본값은 2097152 (2MB)입니다. 변경하지 않거나 MultipartResolver 에서 설정 한 5MB 제한 미만으로 설정 하면 Tomcat은 2MB를 초과하는 파일 업로드 시도를 거부하고 사용자 지정 예외 처리가 호출되지 않습니다.
요청이 성공하고 응용 프로그램의 오류 메시지가 표시되도록하려면 maxSwallowSize 속성을 음수 값 으로 설정해야 합니다. 이렇게하면 Tomcat이 파일 크기에 관계없이 실패한 모든 업로드를 삼키도록 지시합니다.
이는 TOMCAT_HOME / conf / server.xml 파일 에서 수행 됩니다.
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxSwallowSize = "-1"/>
6. 결론
이 기사에서는 Spring에서 최대 파일 업로드 크기를 구성하는 방법과 클라이언트가이 크기 제한을 초과하는 파일을 업로드하려고 할 때 발생하는 MaxUploadSizeExceededException 을 처리하는 방법을 설명했습니다 .
이 기사의 전체 소스 코드는 GitHub 프로젝트 에서 찾을 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-maxuploadsizeexceeded
'Java' 카테고리의 다른 글
Spring Social을 사용한 보조 Facebook 로그인 (0) | 2021.04.09 |
---|---|
CRaSH 시작하기 (0) | 2021.04.09 |
Spring MVC에서 Forms 시작하기 (0) | 2021.04.09 |
AngularJS 및 Spring MVC를 사용한 양식 유효성 검사 (0) | 2021.04.08 |
JSTL 라이브러리 사용방법(예제) (0) | 2021.04.08 |