Spring Boot 上传文件教程展示了如何使用 Spring Boot 框架上传单个文件。
Spring 是流行的 Java 应用框架,而 Spring Boot 是 Spring 的演进,可以帮助轻松地创建独立的,生产级的基于 Spring 的应用。
HTML 表单的编码类型
POST 请求有三种编码 HTML 表单类型:
- 应用/ x-www-form-urlencoded
- 多部分/表单数据
- 文字/纯文字
application/x-www-form-urlencoded
是默认编码,其中值编码在由&
分隔的键值元组中。 =
字符用于键和值之间。 非字母数字字符采用百分比编码。 此编码类型不适用于二进制文件。
multipart/form-data
用于非 acsii 数据和二进制文件。 input
元素的type
属性设置为file
。
text/plain
用于调试。
Spring 上传文件示例
在下面的示例中,我们有一个 Web 表单来选择要上传到服务器的文件。 该文件被上传到/var/www/upload
目录。
上传目录
/var/www
目录是 Debian Linux 中 Web 内容的标准目录。
我们将文件上传到/var/www/upload
目录。 www-data
组中的用户可以修改目录文件。 因此,运行 Web 服务器的用户必须在此组中。
应用
以下是 Spring Boot Web 应用的来源。
这是 Spring 应用的项目结构。
pom.xml
这是 Maven pom.xml
文件。
com/zetcode/controller/MyController.java
MyController
从请求中读取文件并将其保存到所选目录中。
StoreageService
将文件存储在磁盘上。
upload()
方法映射到doUpload
URL 模式。 由于我们正在将数据发送到服务器,因此我们使用 POST 请求。 请求参数具有MultipartFile
类型。
成功上传文件后,我们会显示一条消息。
我们有StorageException
的处理程序。
com/zetcode/StorageException.java
这是我们的自定义StorageException
。 当文件无法存储在文件系统上时,将引发该错误。
com/zetcode/service/StorageService.java
StorageService
从输入流复制数据并将其保存在磁盘上。
我们使用@Value
注解从application.properties
文件中读取上传目录。
我们确保已使用isEmpty()
方法选择了一个文件。
我们使用getOriginalFilename()
方法获得文件名。
我们使用getInputStream()
方法获得输入流。
该文件被复制到从与Files.copy()
输入流源的目标目录。
resources/application.properties
在application.properties
中,我们有一个upload.path
属性,用于指定上传目录。
resources/static/index.html
这是主页。 它是src/main/resources/static
目录中的静态文件。 它包含一个用于选择文件并将其发送到 Spring 应用的表单。
我们选择了doUpload
URL 模式。 此表单创建的请求将由 Spring 控制器处理。 enctype
属性指定multipart/form-data
编码类型,这是使用 HTML 格式上传文件所必需的。
input
标签的type
属性使用户可以选择文件。
最后,这是一个提交按钮。
resources/static/success.html
文件成功上传到服务器后,将显示success.html
。
resources/static/failure.html
文件上传失败时,将显示failure.html
。
Application.java
这段代码设置了 Spring Boot 应用。
在本教程中,我们学习了如何在 Spring 应用中上传文件。