springboot (17): загружать файлы с помощью Spring Boot

Spring Boot задняя часть внешний интерфейс Tomcat

Загрузка файлов — один из часто используемых сценариев в Интернете, наиболее типичная ситуация — загрузка аватаров и т. д. Сегодня я предлагаю вам небольшой пример загрузки файлов в Spring Boot.

1, конфигурация пакета pom

Мы используем последнюю версию Spring Boot 1.5.9, jdk 1.8, tomcat8.0.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

представилspring-boot-starter-thymeleafСтаньте движком шаблонов страниц и напишите несколько простых примеров загрузки.

2. Настройки стартового класса

@SpringBootApplication
public class FileUploadWebApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(FileUploadWebApplication.class, args);
    }

    //Tomcat large file upload connection reset
    @Bean
    public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                //-1 means unlimited
                ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        });
        return tomcat;
    }

}

Этот код tomcatEmbedded предназначен для решения проблемы сброса соединения, когда загруженный файл превышает 10M. Содержимое этого исключения GlobalException также не может быть перехвачено.

Для получения подробной информации см.:Tomcat large file upload connection reset

3. Напишите главную страницу

загрузить страницу

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<h1>Spring Boot file upload example</h1>
<form method="POST" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file" /><br/><br/>
    <input type="submit" value="Submit" />
</form>
</body>
</html>

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

Загрузить страницу отображения результатов:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
<h1>Spring Boot - Upload Status</h1>
<div th:if="${message}">
    <h2 th:text="${message}"/>
</div>
</body>
</html>

Схема эффекта выглядит следующим образом:

4. Напишите класс управления загрузкой

Посетите localhost, чтобы автоматически перейти на страницу загрузки:

@GetMapping("/")
public String index() {
    return "upload";
}

Загрузить бизнес-обработку

@PostMapping("/upload") 
public String singleFileUpload(@RequestParam("file") MultipartFile file,
                               RedirectAttributes redirectAttributes) {
    if (file.isEmpty()) {
        redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
        return "redirect:uploadStatus";
    }

    try {
        // Get the file and save it somewhere
        byte[] bytes = file.getBytes();
        Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
        Files.write(path, bytes);

        redirectAttributes.addFlashAttribute("message",
                "You successfully uploaded '" + file.getOriginalFilename() + "'");

    } catch (IOException e) {
        e.printStackTrace();
    }

    return "redirect:/uploadStatus";
}

Приведенный выше код означает, чтоMultipartFileПрочитайте информацию о файле, если файл пуст, перейдите на страницу результатов и дайте подсказку; если он не пуст, прочитайте поток файлов и запишите его в указанный каталог и, наконец, отобразите результат на странице.

MultipartFileЭто класс инкапсуляции для файлов, загруженных Spring. Он содержит такую ​​информацию, как двоичный поток и атрибуты файла файла. Связанные атрибуты также можно настроить в файле конфигурации. Основная информация о конфигурации выглядит следующим образом:

  • spring.http.multipart.enabled=true#Поддержка загрузки файлов по умолчанию.
  • spring.http.multipart.file-size-threshold=0#Поддержка записи файлов на диск.
  • spring.http.multipart.location=# Временный каталог для загрузки файлов
  • spring.http.multipart.max-file-size=1Mb# Максимально поддерживаемый размер файла
  • spring.http.multipart.max-request-size=10Mb# Максимально поддерживаемый размер запроса

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

Дополнительную информацию о конфигурации можно найти здесь:Common application properties

5. Обработка исключений

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MultipartException.class)
    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {
        redirectAttributes.addFlashAttribute("message", e.getCause().getMessage());
        return "redirect:/uploadStatus";
    }
}

установить один@ControllerAdviceконтролироватьMultipartНезависимо от того, ограничен ли размер загружаемого файла, при возникновении этого исключения на странице внешнего интерфейса будет отображаться подсказка. использовать@ControllerAdviceЕсть много вещей, которые можно сделать, например, глобальная унифицированная обработка исключений и т. д. Заинтересованные студенты могут разобраться.

6. Резюме

Такая простая демонстрация с использованием Spring Boot для загрузки файлов завершена Заинтересованные студенты могут скачать пример кода и попробовать его.

Ссылаться на:

Spring Boot file upload example

Пример кода — гитхаб

Образец кода — Облако кода