MultipartResolver из пакета org.springframework.web.multipart – это стратегия для парсинга многокомпонентных запросов, включая загрузку файлов. Существует одна реализация, основанная на FileUpload из проекта Commons, и другая, основанная на парсинге многокомпонентных запросов Servlet 3.0.

Чтобы активировать многокомпонентную обработку, необходимо объявить бин MultipartResolver в конфигурации DispatcherServlet из Spring под именем multipartResolver. DispatcherServlet обнаружит его и применит к входящему запросу. После получения POST с типом содержимого multipart/form-data, распознаватель парсит содержимое, оборачивая текущий HttpServletRequest как MultipartHttpServletRequest, чтобы обеспечить доступ к распознанным файлам в дополнение к открытию компонентов как параметров запроса.

FileUpload из Apache Commons

Чтобы использовать FileUpload из Apache Commons, можно сконфигурировать бин типа CommonsMultipartResolver под именем multipartResolver. Также необходимо иметь jar-файл commons-fileupload в качестве зависимости в вашем classpath.

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

Commons FileUpload традиционно применяется только к POST-запросам, но принимает любой тип содержимого multipart/. Подробности и параметры конфигурации см. в javadoc по CommonsMultipartResolver.

Servlet 3.0

Многокомпонентный парсинг по спецификации Servlet 3.0 должен быть активирован в конфигурации контейнера сервлетов. Для этого:

  • В Java установите MultipartConfigElement на регистрацию сервлетов.

  • В web.xml добавьте раздел "<multipart-config>" к объявлению сервлетов.

В следующем примере показано, как настроить MultipartConfigElement на регистрацию сервлетов:

Java
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    // ...
    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        // Опционально также устанавливает maxFileSize, maxRequestSize, fileSizeThreshold
        registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
    }
}
Kotlin
class AppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
    // ...
    override fun customizeRegistration(registration: ServletRegistration.Dynamic) {
        // Опционально также устанавливает maxFileSize, maxRequestSize, fileSizeThreshold
        registration.setMultipartConfig(MultipartConfigElement("/tmp"))
    }
}

После того, как конфигурация Servlet 3.0 будет создана, вы сможете добавить бин типа StandardServletMultipartResolver под именем multipartResolver.

Этот вариант распознавания использует многокомпонентный парсер вашего контейнера сервлетов "как есть", потенциально подвергая приложение воздействию различий в реализации контейнера. По умолчанию анализатор будет пытаться парсить любой тип содержимого multipart/ с помощью любого HTTP-метода, но это может поддерживаться не всеми контейнерами сервлетов. Подробности и параметры конфигурации см. в javadoc по StandardServletMultipartResolver.