MaxUploadSizeExceededException весной

MaxUploadSizeExceededException весной

1. обзор

В среде SpringMaxUploadSizeExceededException выдается, когда приложение пытается загрузить файл, размер которого превышает определенный порог, указанный в конфигурации.

В этом уроке мы рассмотрим, как указать максимальный размер загрузки. Затем мы покажем простой контроллер загрузки файлов и обсудим различные методы обработки этого исключения.

2. Установка максимального размера загрузки

По умолчанию нет ограничений на размер файлов, которые могут быть загружены. Чтобы установить максимальный размер загрузки, вы должны объявить bean-компонент типаMultipartResolver.

Рассмотрим пример, ограничивающий размер файла до 5 МБ:

@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;
}

Если пользователь пытается загрузить файл размером более 5 МБ, приложение выдаст исключение типаMaxUploadSizeExceededException.

4. ОбработкаMaxUploadSizeExceededException

Чтобы обработать это исключение, мы можем сделать так, чтобы наш контроллер реализовал интерфейсHandlerExceptionResolver, или мы можем создать аннотированный класс@ControllerAdvice.

4.1. РеализацияHandlerExceptionResolver

ИнтерфейсHandlerExceptionResolver объявляет методresolveException(), в котором могут обрабатываться исключения разных типов.

Давайте переопределим методresolveException() для отображения сообщения в случае, если обнаруженное исключение имеет типMaxUploadSizeExceededException:

@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. Создание перехватчика рекомендаций контроллера

Есть несколько преимуществ обработки исключения через перехватчик, а не в самом контроллере. Во-первых, мы можем применить одну и ту же логику обработки исключений к нескольким контроллерам.

Другой заключается в том, что мы можем создать метод, который нацелен только на исключение, которое мы хотим обработать, позволяя фреймворку делегировать обработку исключений без необходимости использовать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 (2 МБ). Если оставить без изменений или если он установлен ниже предела 5 МБ, который мы установили в нашемMultipartResolver, Tomcat отклонит любую попытку загрузить файл размером более 2 МБ, и наша пользовательская обработка исключений никогда не будет вызвана.

Чтобы запрос был успешным и отображалось сообщение об ошибке от приложения, вам необходимо установить для свойстваmaxSwallowSize отрицательное значение. Это указывает Tomcat проглотить все неудачные загрузки независимо от размера файла.

Это делается в файлеTOMCAT_HOME/conf/server.xml:

6. Заключение

В этой статье мы продемонстрировали, как настроить максимальный размер загружаемого файла в Spring и как обрабатыватьMaxUploadSizeExceededException, возникающие, когда клиент пытается загрузить файл, превышающий этот предел размера.

Полный исходный код этой статьи можно найти в папкеGitHub project.