Рубрики
Без рубрики

MaxUploadSizeExceededException весной

Краткий учебник о причине MaxUploadSizeExceededException весной и как с этим справиться.

Автор оригинала: Loredana Crusoveanu.

MaxUploadSizeExceededException весной

1. Обзор

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

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

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

По умолчанию, нет никаких ограничений на размер файлов, которые могут быть загружены. Для того, чтобы установить максимальный размер загрузки, вы должны объявить фасоль типа 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

Для того, чтобы справиться с этим исключением, мы можем заказать наш контроллер HandlerExceptionРесолвер , или мы можем создать @ControllerAdvice аннотированный класс.

4.1. Осуществление HandlerExceptionResolver

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

Давайте переопределим решитьИсключаемость () метод отображения сообщения в случае, если пойманное исключение имеет тип 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. Заключение

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

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