Spring Boot上传文件
1 概述
Java中的文件上传一共涉及两个组件,一个是CommonsMultipartResolver,另一个是StandardServletMultipartResolver,其中CommonsMultipartResolver使用commons-fileupload来处理multipart请求,而StandardServletMultipartResolver则是基于Servlet 3.0来处理multipart请求的,因此若使用StandardServletMultipartResolver,则不需要添加额外的jar包。Tomcat 7.0开始就支持Servlet 3.0了,而Spring Boot 2.0.4内嵌的是Tomcat 8.5.32,因此可以直接使用StandardServletMultipartResolver。
而在Spring Boot提供的文件上传自动化配置类MultipartAutoConfiguration中,默认也是采用StandardServletMultipartResolver,根据其源码(自己阅读)可以看出,如果开发者没有提供MultipartResolver,那么默认采用的MultipartResolver就是StandardServletMultipartResolver。因此,在Spring Boot中上传文件可以做到零配置。下面来看具体的上传过程。
2 单文件上传
2.1 创建项目,并添加依赖
首先创建一个Spring Boot项目,并添加spring-boot-starter-web依赖。这是应用Spring Boot构建web应用程序所必须的依赖,不需要添加文件上传相关的依赖,这确实做到了零配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2 编写html上传页面
在resources目录下的static目录中创建一个upload.html文件,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="请选择文件">
<input type="submit" value="上传">
</form>
</body>
</html>
其中,action的值要和后端Cotroller的请求url相同,method必须为post,enctype的值如上所示。编写的html页面的效果如下所示:
2.3 后端Controller
package com.example.demo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@RestController
public class FileUploadController {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
@PostMapping("/upload")
public String upload(MultipartFile uploadFile, HttpServletRequest req) {
String realPath = req.getSession().getServletContext().getRealPath("/uploadFile/");
String format = sdf.format(new Date());
File folder = new File(realPath + format);
if (!folder.isDirectory()) {
folder.mkdirs();
}
String oldName = uploadFile.getOriginalFilename();
String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());
try {
uploadFile.transferTo(new File(folder, newName));
String filePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/uploadFile/" + format + newName;
return "上传成功:" + filePath;
} catch (IOException e) {
e.printStackTrace();
}
return "上传失败";
}
}
2.4 测试
最后在浏览器中进行测试。启动项目,在浏览器中输入“http://localhost:8080/upload.html”进行文件上传,如下图所示:
点击“上传”按钮即可,如下图所示:
如果要查看上传的文件,有两种方法:
第一种:
复制粘贴上述返回的地址到浏览器中访问即可:
第二种:
2.5 注意事项
1、html上传页面的action值必须要和后端Controller接口地址相同。
2、<input type="file" name="uploadFile" value="请选择文件">
中name的值(uploadFile)必须要和后端MultipartFile的值相同。
3、如果开发者需要对上传文件的细节进行配置,也是可以的,代码如下:
spring.servlet.multipart.enable=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.location=D://temp
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.resolve-lazily=false
第1行表示是否开启文件上传支持,默认为true
第2行表示文件写入磁盘的阈值,默认为0
第3行表示上传文件的临时保存位置
第4行表示上传的单个文件的最大大小,默认1MB
第5行表示多文件上传时文件的总大小,默认10MB
第6行表示文件是否延迟解析,默认为false
3 多文件上传
下次遇到再写。