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

Загрузка файлов с помощью Spring MVC

В этой статье мы сосредоточимся на поддержке нескольких частей (загрузка файлов) в веб-приложениях Spring MVC.

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

1. Обзор

В предыдущих статьях мы познакомились с основами обработки форм и изучили библиотеку тегов форм в Spring MVC.

В этой статье мы сосредоточимся на том, что Spring предлагает для поддержки multipart (загрузка файлов) в веб-приложениях.

Spring позволяет нам включить эту составную поддержку с подключаемыми объектами MultipartResolver . Фреймворк предоставляет одну реализацию MultipartResolver для использования с Commons FileUpload и другую для использования с Servlet 3.0 разбором составных запросов.

После настройки MultipartResolver мы увидим, как загрузить один файл и несколько файлов.

Мы также коснемся Spring Boot.

2. Загрузка файлов Commons

Чтобы использовать CommonsMultipartResolver для обработки загрузки файла, нам нужно добавить следующую зависимость:


    commons-fileupload
    commons-fileupload
    1.4

Теперь мы можем определить компонент CommonsMultipartResolver в нашей конфигурации Spring.

Этот MultipartResolver поставляется с рядом set методов для определения свойств, таких как максимальный размер для загрузки:

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(100000);
    return multipartResolver;
}

Здесь нам нужно управлять различными свойствами CommonsMultipartResolver в самом определении компонента.

3. С сервлетом 3.0

Чтобы использовать Servlet 3.0 многоступенчатый синтаксический анализ, нам нужно настроить пару частей приложения. Во-первых, нам нужно установить MultipartConfigElement в нашем DispatcherServlet | регистрации :

public class MainWebAppInitializer implements WebApplicationInitializer {

    private String TMP_FOLDER = "/tmp"; 
    private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; 
    
    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        
        ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(
          new GenericWebApplicationContext()));

        appServlet.setLoadOnStartup(1);
        
        MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER, 
          MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);
        
        appServlet.setMultipartConfig(multipartConfigElement);
    }
}

В объекте MultipartConfigElement мы настроили расположение хранилища, максимальный размер отдельного файла, максимальный размер запроса (в случае нескольких файлов в одном запросе) и размер, при котором ход загрузки файла сбрасывается в хранилище.

Эти параметры должны применяться на уровне servletregistration, так как Servlet 3.0 не позволяет регистрировать их в MultipartResolver , как в случае с CommonsMultipartResolver.

Как только это будет сделано, мы можем добавить StandardServletMultipartResolver в нашу весеннюю конфигурацию:

@Bean
public StandardServletMultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}

4. Загрузка файла

Чтобы загрузить наш файл, мы можем создать простую форму, в которой мы используем HTML input tag с type=’file’.

Независимо от выбранной нами конфигурации обработки загрузки, нам необходимо установить атрибут кодирования формы в multipart/form-data. Это позволяет браузеру узнать, как кодировать форму:


    
Select a file to upload

Для хранения загруженного файла мы можем использовать переменную MultipartFile . Мы можем получить эту переменную из параметра запроса в методе вашего контроллера:

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String submit(@RequestParam("file") MultipartFile file, ModelMap modelMap) {
    modelMap.addAttribute("file", file);
    return "fileUploadView";
}

Класс MultipartFile предоставляет доступ к подробной информации о загруженном файле , включая имя файла, тип файла и так далее. Мы можем использовать простую HTML-страницу для отображения этой информации:

Submitted File

OriginalFileName: ${file.originalFilename}
Type: ${file.contentType}

5. Загрузка Нескольких Файлов

Чтобы загрузить несколько файлов в одном запросе, мы просто помещаем несколько полей входного файла в форму:


    
Select a file to upload
Select a file to upload
Select a file to upload

Нам нужно позаботиться о том, чтобы каждое поле ввода имело одно и то же имя, чтобы к нему можно было получить доступ в виде массива MultipartFile :

@RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST)
public String submit(@RequestParam("files") MultipartFile[] files, ModelMap modelMap) {
    modelMap.addAttribute("files", files);
    return "fileUploadView";
}

Теперь мы можем просто перебрать этот массив, чтобы отобразить информацию о файлах:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    
        Spring MVC File Upload
    
    
        

Submitted Files

OriginalFileName: ${file.originalFilename}
Type: ${file.contentType}

6. Загрузка Файлов С Дополнительными Данными Формы

Мы также можем отправить дополнительную информацию на сервер вместе с загружаемым файлом. Нам просто нужно включить необходимые поля в форму:


    
Name
Email
Select a file to upload

В контроллере мы можем получить все данные формы, используя аннотацию @RequestParam :

@PostMapping("/uploadFileWithAddtionalData")
public String submit(
  @RequestParam MultipartFile file, @RequestParam String name,
  @RequestParam String email, ModelMap modelMap) {

    modelMap.addAttribute("name", name);
    modelMap.addAttribute("email", email);
    modelMap.addAttribute("file", file);
    return "fileUploadView";
}

Как и в предыдущих разделах, мы можем использовать HTML-страницу с тегами JSTL для отображения информации.

Мы также можем инкапсулировать все поля формы в классе модели и использовать @ModelAttribute аннотацию в контроллере. Это было бы полезно, когда вместе с файлом есть много дополнительных полей. Давайте посмотрим на код:

public class FormDataWithFile {

    private String name;
    private String email;
    private MultipartFile file;

    // standard getters and setters
}
@PostMapping("/uploadFileModelAttribute")
public String submit(@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {

    modelMap.addAttribute("formDataWithFile", formDataWithFile);
    return "fileUploadView";
}

7. Загрузка файла Весенней Загрузки

Если мы используем Spring Boot, все, что мы видели до сих пор, все еще применимо.

Тем не менее, Spring Boot позволяет еще проще настроить и запустить все без особых хлопот.

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


    org.springframework.boot
    spring-boot-starter-web
    2.1.8.RELEASE

Мы можем найти последнюю версию spring-boot-starter-web на Maven Central.

Если мы хотим контролировать максимальный размер загружаемого файла, мы можем отредактировать наш Если мы хотим контролировать максимальный размер загружаемого файла, мы можем отредактировать наш :

spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB

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

spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=${java.io.tmpdir}

Обратите внимание, что мы использовали ${java.io.tmpdir} чтобы определить местоположение загрузки, чтобы мы могли использовать временное местоположение для разных операционных систем.

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

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

Реализацию этого учебника можно найти в проекте GitHub . Когда проект выполняется локально, пример формы можно получить по адресу http://localhost:8080/spring-mvc-java/fileUpload