听说不学习是要回家继承家业的。
1 Spring Boot 处理文件上传及路径回显
1.2 Spring MVC 文件上传流程
以往在使用 Spring 的 web 项目开发中,我们通常会使用 Spring MVC 框架提供的文件上传工具类进行文件上传,也就是 MultipartResolver ,利用 SpringMVC 实现文件上传功能,离不开对 MultipartResolver 的设置,MultipartResolver 这个类,你可以将其视为 SpringMVC 实现文件上传功能时的工具类,这个类也只会在文件上传中发挥作用,在配置了具体实现类之后,SpringMVC 中的 DispatcherServlet 在处理请求时会调用 MultipartResolver 中的方法判断此请求是不是文件上传请求,如果是的话 DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart(request) 方法对该请求对象进行装饰并返回一个新的 MultipartHttpServletRequest 供后继处理流程使用,注意!此时的请求对象会由 HttpServletRequest 类型转换成 MultipartHttpServletRequest 类型,这个类中会包含所上传的文件对象可供后续流程直接使用而无需自行在代码中实现对文件内容的读取和对象封装的逻辑。
在 Spring Boot 中也是通过该工具类进行文件上传,与普通的 Spring web 项目不同的是,Spring Boot 在自动配置 DispatcherServlet 时也配置好了 MultipartResolver ,而无需再像原来那样在 springmvc 配置文件中增加文件上传配置的 bean。
1.3 Spring Boot 文件上传功能实现
由于 Spring Boot 自动配置机制的存在,只要在 pom 文件中引入 web starter 模块即可直接进行文件上传功能。Spring Boot 中 MultipartFile 的常用配置和默认值如下:
配置含义注释:
spring.servlet.multipart.enabled
是否支持 multipart 上传文件,默认支持
spring.servlet.multipart.file-size-threshold
文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,(默认值 0 ,一般情况下不用特意修改)
spring.servlet.multipart.location
上传文件的临时目录
spring.servlet.multipart.max-file-size
最大支持文件大小,默认 1 M ,该值可适当的调整
spring.servlet.multipart.max-request-size=10Mb
最大支持请求大小,默认 10 M
spring.servlet.multipart.resolve-lazily
判断是否要延迟解析文件(相当于懒加载,一般情况下不用特意修改)
1.4 上传功能实现
1.4.1 新建文件上传页面
在 static 目录中新建 upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Spring Boot 文件上传测试</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="文件上传" />
</form>
</body>
</html>
文件上传的请求地址为 /upload,请求方法为 post,在文件上传时要设置 enctype="multipart/form-data",页面中包含一个文件选择框和一个提交框。
1.4.2 新建文件上传处理 Controller
UploadController.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Controller
public class UploadController {
// 文件保存路径 主要需要自己先建立对应upload文件夹路径
private final static String FILE_UPLOAD_PATH = "c:/";
@PostMapping(value = "/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "上传失败";
}
String fileName = file.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf("."));
// 生成文件名称通用方法
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
Random r = new Random();
StringBuilder tempName = new StringBuilder();
tempName.append(sdf.format(new Date())).append(r.nextInt(100)).append(suffixName);
String newFileName = tempName.toString();
try {
// 保存文件
byte[] bytes = file.getBytes();
Path path = Paths.get(FILE_UPLOAD_PATH + newFileName);
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
return "上传成功";
}
}
1.4.3 Spring Boot 文件上传路径回显
但是正常情况下,我们上传文件是要实际应用到业务中的,比如图片上传,上传后我们需要知道它的路径,最好能够在页面中直接看到它的回显效果,像前一个步骤中,我们只是成功的完成了文件上传,但是如何去访问这个文件还不得而知。Spring Boot 不像普通的 web 项目可以上传到 webapp 指定目录中,通常的做法是使用自定义静态资源映射目录,以此来实现文件上传整个流程的闭环,比如前一小节中的实际案例,在文件上传到 upload 目录后,增加一个自定义静态资源映射,使得 upload 下的静态资源可以通过该映射地址被访问到,实现方法如下:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SpringBootWebMvcConfigurer implements WebMvcConfigurer {
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**").addResourceLocations("file:/D:/");
}
}
通过该设置,所有以 /files/ 开头的静态资源请求都会映射到D:/目录下
修改UploadController
return "上传成功,图片地址为:/files/" + newFileName;