Lingmoumou's Blog

きっといつかって愿うまま

0%

SpringBoot 文件的上传与下载

文件上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {

@PostMapping
public FileInfo upload(MultipartFile file) throws IOException {
System.out.println(file.getName());
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize());

File localFile=new File(folder,System.currentTimeMillis()+".txt");
file.transferTo(localFile);
return new FileInfo(localFile.getAbsolutePath());
}
}

一般情况下,上传的文件不会存放在本地,因此可以将file.transferTo()改成file.getInputStream(),获取文件流,然后写入其他地方中,如OSS中。

对上传的文件进行一些配置:

1
2
3
4
5
6
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-size=10Mb # 最大支持请求大小
spring.servlet.multipart.resolve-lazily=false # 是否支持 multipart 上传文件时懒加载

如果不限制大小,则设置为-1即可

1
2
spring.servlet.multipart.maxFileSize=-1
spring.servlet.multipart.maxRequestSize=-1

文件下载

以下方法是通过浏览器直接下载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {

@GetMapping("/{id}")
public void download(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) throws IOException {

try (InputStream inputStream=new FileInputStream(new File(folder,id+".txt"));
OutputStream outputStream=response.getOutputStream();){
response.setContentType("application/x-download");
response.addHeader("Content-Disposition","attachment;filename=test.txt");

IOUtils.copy(inputStream,outputStream);
outputStream.flush();
}

}
}