文章目录




一、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测试:

SpringBoot学习笔记(十:文件上传下载 )_spring


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测试:

SpringBoot学习笔记(十:文件上传下载 )_文件上传_02



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:

SpringBoot学习笔记(十:文件上传下载 )_spring_03



本文为学习笔记类博客,学习资料来源见参考!



参考:

【1】:《精通 Spring Boot 42 讲》

【2】:​​SpringBoot | 第十七章:web应用开发之文件上传 ​

【3】:《深入浅出SpringBoot2.X》

【4】:​​SpringMVC 教程–8. 文件上传​

【5】:​​SpringBoot 文件上传、下载、设置大小​

【6】:​​Spring Boot 上传文件​