`

Spring Boot文件上传示例

 
阅读更多

本文介绍如何在Spring Boot Web应用程序中上传文件。

使用的工具 :

  1. Spring Boot 1.4.3.RELEASE
  2. Spring 4.3.5.RELEASE
  3. Thymeleaf
  4. Maven 3
  5. Embedded Tomcat 8.5.6

1. 项目结构

标准项目结构如下图所示 -

2. 项目依赖

Spring boot依赖关系,无需额外的文件上传库。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yiibai</groupId>
    <artifactId>spring-boot-file-upload</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>

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

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

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- hot swapping, disable cache for template, enable live reload -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- Package as an executable jar/war -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
XML

3.文件上传示例

Spring Boot文件上传,不需要什么特别的配置。在Controller中,将上传的文件映射到MultipartFile
文件:UploadController.java -

 

package com.yiibai.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@Controller
public class UploadController {

    //Save the uploaded file to this folder
    private static String UPLOADED_FOLDER = "D://temp//";

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

    @PostMapping("/upload") // //new annotation since 4.3
    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";
    }

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

}
Java

thymeleaf,只是一些普通的HTML文件标签。文件:upload.html -

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>

<h1>Spring Boot文件上传示例</h1>

<form method="POST" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file" /><br/><br/>
    <input type="submit" value="提交" />
</form>

</body>
</html>
HTML

另外一个页面,用为显示文件上传的状态。文件:uploadStatus.html -

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>

<h1>Spring Boot文件上传状态</h1>

<div th:if="${message}">
    <h2 th:text="${message}"/>
</div>

</body>
</html>
HTML

4. 超过最大上传大小

要处理最大上传大小超出异常,请声明一个@ControllerAdvice并捕获MultipartException
文件:GlobalExceptionHandler.java

package com.yiibai.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@ControllerAdvice
public class GlobalExceptionHandler {

    //http://jira.spring.io/browse/SPR-14651
    //4.3.5 supports RedirectAttributes redirectAttributes
    @ExceptionHandler(MultipartException.class)
    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {

        redirectAttributes.addFlashAttribute("message", e.getCause().getMessage());
        return "redirect:/uploadStatus";

    }

}
Java

5. Tomcat连接重置

如果部署到Tomcat,请配置maxSwallowSize以避免此Tomcat连接重置问题。 对于嵌入式Tomcat,声明一个TomcatEmbeddedServletContainerFactory,如下所示, SpringBootWebApplication.java -

package com.yiibai;

import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;

//http://www.agilegroup.co.jp/technote/springboot-fileupload-error-handling.html
@SpringBootApplication
public class SpringBootWebApplication {

    private int maxUploadSizeInMb = 10 * 1024 * 1024; // 10 MB

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringBootWebApplication.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;

    }

}
Java

6. Multipart文件大小

默认情况下,Spring Boot max文件上传大小为1MB,可以通过以下应用程序属性来配置它的值,application.properties -

 

#http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
#search multipart
spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB

7. 运行示例

使用默认的嵌入式Tomcat启动Spring Boot的命令如下: mvn spring-boot:run ,运行结果如下 -

23:40:03,238 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5a39699c - Registering current configuration as safe fallback point


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
::Spring Boot::       (v1.4.3.RELEASE)

2017-03-30 23:40:04 INFO  com.yiibai.SpringBootWebApplication - Starting SpringBootWebApplication on MY-PC with PID 880 (F:\worksp\springboot\file-upload\target\classes started by Administrator in F:\worksp\springboot\file-upload)
2017-03-30 23:40:04 DEBUG com.yiibai.SpringBootWebApplication - Running with Spring Boot v1.4.3.RELEASE, Spring v4.3.5.RELEASE
2017-03-30 23:40:04 INFO  com.yiibai.SpringBootWebApplication - No active profile set, falling back to default profiles: default
2017-03-30 23:40:08 INFO  com.yiibai.SpringBootWebApplication - Started SpringBootWebApplication in 5.359 seconds (JVM running for 6.355)
Java

打开浏览器,访问: http://localhost:8080/ 输出结果如下 -

选择一个文件并将其上传,选择大于10mb的文件,将会看到页面提示如下 -

 

本站代码下载:http://www.yiibai.com/siteinfo/download.html

 

http://www.yiibai.com/spring-boot/file-upload.html

分享到:
评论

相关推荐

    Spring boot 示例 官方 Demo

    spring-boot-file-upload:使用Spring Boot 上传文件示例 spring-boot-fastDFS:Spring Boot 整合FastDFS示例 spring-boot-actuator:Spring Boot Actuator 使用示例 spring-boot-admin-simple:Spring Boot Admin ...

    基于Spring Boot框架的示例项目.zip

    基于Spring Boot框架的示例项目 项目简介 本项目是一个基于Spring Boot框架的示例项目,旨在展示Spring Boot在实际开发中的各种应用场景。项目涵盖了从基础的RESTful接口实现到高级的监控、部署和日志管理等多个...

    spring-boot示例项目

    本项目示例基于spring boot 最新版本(2.1.9)实现,Spring Boot、Spring Cloud 学习示例,将持续更新…… 在基于Spring Boot、Spring Cloud 分布微服务开发过程中,根据实际项目环境,需要选择、集成符合项目...

    about learning Spring Boot. Spring Boot 教程、技术栈示例代码,快速简单上手教程.zip

    Spring Boot 学习示例 Spring Boot 2.0 Mysql 5.6 JDK 1.8 Maven license Spring Boot 使用的各种示例,以最简单、最实用为标准,此开源项目中的每个示例都以最小依赖,最简单为标准,帮助初学者快速掌握 Spring ...

    spring-boot-multitenant, Spring Boot 多租户示例.zip

    spring-boot-multitenant, Spring Boot 多租户示例 spring-boot-multitenant这是一个 Spring Boot 多租户示例,使用多个数据源来保存不同模式中的数据。 使用 Hibernate多租赁支持插件,使用独立的数据库策略。编译...

    Spring Boot实现文件上传示例代码

    本示例将深入探讨如何在Spring Boot应用中实现文件上传,包括单个文件和多个文件的上传处理。 首先,我们需要在Spring Boot的配置文件(application.properties或application.yml)中配置文件存储路径。例如: ```...

    20170103 Spring boot Pom文件 示例 【不断完善中】

    标题 "20170103 Spring Boot Pom 文件 示例 【不断完善中】" 暗示了这是一个关于Spring Boot项目构建过程中的POM文件(Project Object Model)的示例教程,其中可能包含了不同版本或配置的POM文件,用于演示如何在...

    Spring Boot 学习示例

    **Spring Boot 学习示例** Spring Boot 是一个由 Pivotal 团队开发的 Java 框架,旨在简化初始设置和配置,使开发者能够快速地构建基于 Spring 平台的应用程序。它通过内嵌的 Servlet 容器(如 Tomcat 或 Jetty)...

    spring boot 文件上传实例

    这个简单示例展示了Spring Boot如何处理文件上传。在实际应用中,你可能还需要处理错误、验证文件大小和类型,以及将文件存储到数据库或云服务等更复杂的场景。但这个基础案例足以让你开始理解Spring Boot中的文件...

    Spring Boot整合MyBatis 示例代码

    在提供的压缩包文件"SprintBoot-MyBatis"中,应该包含了上述各个步骤的示例代码,包括配置文件、实体类、Mapper接口、XML映射文件和服务类等。通过阅读和运行这些代码,你可以更好地理解和掌握Spring Boot与MyBatis...

    spring-boot-test示例程序

    本示例程序是关于"Spring Boot Test"的实践,它展示了如何进行Spring Rest Controller的集成测试和单元测试。 1. **Spring Boot Test模块**: Spring Boot提供了测试支持模块,包含`spring-boot-starter-test`,这...

    spring boot资料以及项目

    Spring Boot的配置文件(application.properties或application.yml)的使用方法,以及如何通过@ConfigurationProperties将配置绑定到Java对象,也是学习的重点。 Spring Boot对于数据库的支持非常全面,包括JDBC、...

    Spring Boot 教程、技术栈示例代码,快速简单上手教程。

    在 `6.spring-boot-examples__ityouknow` 压缩包中,可能包含多个示例项目,每个项目都展示了 Spring Boot 的不同应用场景,比如: - `spring-boot-web-example`:展示如何创建一个简单的 RESTful API。 - `spring-...

    spring boot 示例代码

    【Spring Boot 示例代码】是一个专为初学者设计的项目,旨在教授如何利用Spring Boot搭建RESTful API服务。Spring Boot是Spring框架的一个子项目,它简化了配置和启动过程,使得开发者能够快速创建独立运行的Java...

    Spring Boot示例

    这个"Spring Boot示例"资源显然是为了帮助新手更好地理解和掌握Spring Boot的使用。让我们深入探讨Spring Boot的关键特性和一些核心概念。 1. **快速起步:** Spring Boot通过提供“起步依赖”(Starter POMs)使...

    Spring Boot整合Spring Batch,实现批处理

    在这个提供的压缩包文件中,名为"batch"的文件可能包含了一个简单的Spring Boot和Spring Batch整合的示例项目。这些文件可能包括Java源代码、配置文件以及可能的测试用例。通过查看这些文件,你可以学习如何将批处理...

    spring boot restful 接口示例项目

    在本项目中,`pom.xml` 文件定义了项目依赖,如 Spring Boot Starter Web、Spring Data JPA 等,使得我们能方便地引入所需库。 2. **Spring Boot Starter Web**:这是 Spring Boot 的核心组件之一,提供了使用 ...

    spring boot读取Excel操作示例

    本文介绍了 Spring Boot 读取 Excel 操作的示例代码,该示例代码使用 Apache POI 库读取 Excel 文件,并将数据存储在 Map 中。该示例代码可以帮助开发者快速实现 Spring Boot 读取 Excel 操作,提高开发效率。

    spring boot 2.1.1代码示例

    这个压缩包文件很可能是包含了一些示例代码,帮助学习者理解和使用Spring Boot 2.1.1版本的核心特性。 首先,让我们深入了解一下Spring Boot的关键特性: 1. **自动配置**:Spring Boot的核心特性之一是自动配置。...

Global site tag (gtag.js) - Google Analytics