@[Toc]
一、SpringMVC上传文件
Spring MVC 文件上传提供了良好的支持 ,而在 Spring Boot 更为简单地配置文件上传
所需的内容。
SpringMVC 中对文件上传做了封装,可以实现更简单地文件上传。从 Spring3.1 开始,对于文件上传,提供了两个处理器:
- CommonsMultipartResolver
- StandardServletMultipartResolver
第一个处理器兼容性较好,可以兼容 Servlet3.0 之前的版本,但是它依赖了 commons-fileupload 这个第三方工具,所以如果使用这个,一定要添加 commons-fileupload 依赖。
第二个处理器兼容性较差,它适用于 Servlet3.0 之后的版本,它不依赖第三方工具,使用它,可以直接做文件上传。
二、SpringBoot文件上传
我们这里采用StandardServletMultipartResolver处理器来上传文件:
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、配置
#⽀持的最⼤⽂件
spring.servlet.multipart.max-file-size=100MB
#⽂件请求最⼤限制
spring.servlet.multipart.max-request-size=100MB
除了这两个配置之外常用的配置:
- spring.servlet.multipart.enabled=true,是否⽀持 multipart 上传⽂件
- spring.servlet.multipart.file-size-threshold=0,⽀持⽂件写⼊磁盘
- spring.servlet.multipart.location=,上传⽂件的临时⽬录
- spring.servlet.multipart.max-file-size=10Mb,最⼤⽀持⽂件⼤⼩
- spring.servlet.multipart.max-request-sizee=10Mb,最⼤⽀持请求⼤⼩
- spring.servlet.multipart.resolve-lazily=false,是否⽀持 multipart 上传⽂件时懒加载
3、上传单个文件
可以用SpringBoot默认的thymeleaf模板,这里就只写后端的接口。
同样地,偷了下懒,异常处理和结果封装都没有写……
/**
* 上传单个文件
*
* @param file
* @param redirectAttributes
* @return
*/
@PostMapping("/upload")
public String singleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
//文件非空判断
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute("message", "请选择一个文件");
return "文件为空,请重新上传";
}
try {
// Get the file and save it somewhere
byte[] bytes = file.getBytes();
// UPLOADED_FOLDER ⽂件本地存储地址
Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
//保存文件
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
return "上传文件成功!";
}
用PostMan测试:
4、上传多个文件
稍作修改,MultipartFile 需要修改为按照数组的⽅式去接收。
/**
* 上传多个文件
*
* @param files
* @param redirectAttributes
* @return
*/
@PostMapping("/uploadMore")
public String moreFileUpload(@RequestParam("file") MultipartFile[] files,
RedirectAttributes redirectAttributes) {
if (files.length == 0) {
return "文件不能为空,请选择一个文件!";
}
for (MultipartFile file : files) {
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
return "所有文件上传成功!";
}
用PostMan测试:
5、文件下载
/**
* 下载文件
* @param response
* @param fileName
* @return
*/
@GetMapping("/downloadFile")
public String downloadFile(HttpServletResponse response, @RequestParam("fileName") String fileName) {
File file = new File(UPLOADED_FOLDER+fileName);
if (!file.exists()) {
return "文件不存在!";
}
response.reset();
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
try {
InputStream inStream = new FileInputStream(fileName);
OutputStream os = response.getOutputStream();
byte[] buff = new byte[1024];
int len = -1;
while ((len = inStream.read(buff)) > 0) {
os.write(buff, 0, len);
}
os.flush();
os.close();
inStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return "下载成功!";
}
由于接口是get请求方式,所以直接用浏览器访问 localhost:8080/downloadFile?fileName=001.jpg:
本文为学习笔记类博客,学习资料来源见参考!
参考: 【1】:《精通 Spring Boot 42 讲》 【2】:[SpringBoot | 第十七章:web应用开发之文件上传 ](https://blog.lqdev.cn/2018/08/07/springboot/chapter-seventeen/) 【3】:《深入浅出SpringBoot2.X》 【4】:[SpringMVC 教程--8. 文件上传](http://springmvc.javaboy.org/2019/1110/fileupload) 【5】:[SpringBoot 文件上传、下载、设置大小](https://www.cnblogs.com/chevin/p/9260842.html) 【6】:[Spring Boot 上传文件](https://www.itcto.cn/springboot/spring-boot-file/)