上传文件(Uploading Files)
创建可以接收HTTP多部分文件上传的服务器应用程序
你会建立什么
您将创建一个接受文件上传的Spring Boot Web应用程序。您还将构建一个简单的HTML界面来上传测试文件。
环境依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
创建一个应用程序类
要开始一个Spring Boot MVC应用程序,我们首先需要一个启动器; 这里,spring-boot-starter-thymeleaf
和spring-boot-starter-web
已经被添加为依赖。要使用Servlet容器上传文件,您需要注册一个MultipartConfigElement
类(它是web.xml中的<multipart-config>
)。感谢Spring Boot,一切都为您自动配置!
作为自动配置Spring MVC的一部分,Spring Boot将创建一个MultipartConfigElement
bean并为文件上传做好准备。
创建一个文件上传控制器
初始应用程序已经包含几个类来处理在磁盘上存储和加载上传的文件; 它们都在hello.storage包。将在FileUploadController中使用它们。
src/main/java/hello/FileUploadController.java
这个类被@Controller注释,所以Spring MVC能获得它并找到路由。每个方法都标记为@GetMapping或@PostMapping,为了将路径和HTTP操作绑定到一个特定的控制器操作。
在这个例子中:
GET /:从StorageService中,获取上传的文件的当前列表,并将其加载到Thymeleaf模板中。使用MvcUriComponentsBuilder,它计算一个到实际资源的链接
GET /files/{filename}:如果资源存在,则加载资源;并使用"Content-Disposition"响应标头,将其发送到浏览器进行下载
POST /:处理一个多部分的消息file,并将其交给StorageService以保存
为了控制器与存储层交互,您需要StorageService。
src/main/java/hello/storage/StorageService.java
创建一个简单的HTML模板
src/main/resources/templates/uploadForm.html
这个模板有三个部分:
顶部的Spring MVC写闪存范围消息的可选消息
允许用户上传文件的表单
从后端提供的文件列表
调整文件上传限制
配置文件上传时,通常对文件大小设置限制。想象一下,试图处理5GB文件上传!我们可以调整它的自动配置MultipartConfigElement的一些属性设置
。
src/main/resources/application.properties
spring.http.multipart.max-file-size
=128KB,文件总大小不能超过128KB。
spring.http.multipart.max-request-size
=128KB,一个multipart/form-data的总请求大小不能超过128KB。
您还需要一个目标文件夹来上传文件,因此我们来增强基本Application
类并添加一个Boot CommandLineRunner
,它将在启动时删除并重新创建该文件夹:
src/main/java/hello/Application.java
这将运行接收文件上传的服务器端部分。日志输出显示。
在服务器运行时,您需要打开浏览器并访问 http://localhost:8080/ 以查看上载表单。
测试你的应用
有多种方法可以在我们的应用程序中测试这个特定的功能。这是一个利用MockMvc的例子,所以它不需要启动Servlet容器:
src/test/java/hello/FileUploadTests.java
在这些测试中,我们使用各种模拟来设置与控制器和StorageService的交互,同时使用MockMultipartFile来与Servlet容器本身进行交互。
集成测试的一个例子,请查看FileUploadIntegrationTests类。
概要
恭喜!您刚刚编写了一个使用Spring处理文件上传的Web应用程序。