Spring boot - MultipartFile 에서 발생하는 예외 처리

목차

MaxUploadSizeExceededException 예외

MaxUploadSizeExceededException 예외가 발생하는 경우는 크게 두 가지가 있다. 첫 번째는 FileSizeLimitExceededException 예외가 발생했을 때 두 번째는 SizeLimitExceededException 예외가 발생했을 때다.

FileSizeLimitExceededException

서버로 전송되는 각 파일 크기가 제한을 초과했을 때 발생하는 예외, 기본값은 1MB다.
org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

SizeLimitExceededException

서버로 전송되는 모든 파일 크기가 제한을 초과했을 때 발생하는 예외, 기본값은 10MB다.
org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (29404104) exceeds the configured maximum (10485760)

MaxUploadSizeExceededException 예외 해결하기

Properties에 속성 추가

MaxUploadSizeExceededException 예외를 해결하는 방법은 스프링 properties에 spring.servlet.multipart.max-file-size 값을 명시적으로 늘려주면 된다.

spring.servlet.multipart.max-file-size=200MB

SizeLimitExceededException 예외를 해결하는 방법은 스프링 properties에 spring.servlet.multipart.max-request-size 값을 명시적으로 늘려주면 된다.

spring.servlet.multipart.max-request-size=200MB

MultipartResolver 등록하기

스프링 properties에 값을 추가하는 방식 외에도 MultipartResolver Bean을 등록해 MaxUploadSize값을 설정하는 방법이 있다.

의존성 추가

// https://mvnrepository.com/artifact/commons-io/commons-io
implementation group: 'commons-io', name: 'commons-io', version: '2.11.0'

// https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.4'

MultipartResolver 는 setMaxUploadSize 메소드를 통해 모든 파일 크기에 대한 설정을 setMaxUploadSizePerFile 메소드를 통해 각각의 파일 크기에 대한 설정을 할 수 있다. 아무 설정도 안하면 Max갑이 없어 파일 크기에 제한이 없다.

@SpringBootApplication
public class DemoMultipartApplication {

public static void main(String[] args) {
SpringApplication.run(DemoMultipartApplication.class, args);
}

@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(524288000);
multipartResolver.setMaxUploadSizePerFile(52428800);
return multipartResolver;
}
}

예외 처리

ControllerAdvice 어노테이션을 이용한 예외 처리

@ControllerAdvice
@Slf4j
public class FileExceptionControllerAdvice {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ResponseEntity handleMaxSizeException(MaxUploadSizeExceededException exc, HttpServletRequest request, HttpServletResponse response) {
log.info("File size exceeds limit!");
return ResponseEntity.notFound().build();
}
}

HandlerExceptionResolver 인터페이스 구현을 통한 예외처리

@Component
@Slf4j
public class FileExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView("file");
if (ex instanceof MaxUploadSizeExceededException) {
log.info("File size exceeds limit!");
modelAndView.getModel().put("message", "File size exceeds limit!");
}
return modelAndView;
}
}
Share