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.