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 프로젝트 에서 찾을 수 있습니다 .