SpringBoot实现文件上传下载功能
开发环境
- SpringBoot 2.2.1.RELEASE
- web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置参数介绍
#启用文件上传,默认为true
- spring.servlet.multipart.enabled=true
#文件大于该阈值时,将写入磁盘(KB/MB)
- spring.servlet.multipart.file-size-threshold=0KB
#单个文件最大值(KB/MB)
- spring.servlet.multipart.max-file-size=10MB
#单个请求多个文件的最大值(KB/MB)
- spring.servlet.multipart.max-request-size=10MB
文件上传
前端(单个文件上传)
- pom文件导入tymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 配置tymeleaf
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=false
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>thymeleaf test</title>
</head>
<body>
<form method="post" enctype="multipart/form-data"
action="/upload" target="uploadFrame">
<input type="file" name="file"/>
<input type="submit" name="Submit" value="上传"/>
</form>
</body>
</html>
后端接口以及功能实现(单个文件上传)
@Autowired
private FileManageService fileManageService;
@PostMapping("/upload")
@ResponseBody
public String fileUpload(@RequestParam("file") MultipartFile file){
if (Objects.isNull(file)){
return "文件上传失败,请重新选择文件";
}
return fileManageService.upload(file);
}
private static final Logger LOGGER = LoggerFactory.getLogger(FileManageService.class);
@Value("${file_hostpath}")
private String fileHostPath;
@Override
public String upload(MultipartFile file) {
File test = new File(fileHostPath+file.getOriginalFilename());
if (!test.exists()){
test.mkdirs();
}
try {
file.transferTo(test);
}catch (IOException e){
LOGGER.error(file.getOriginalFilename()+"文件上传失败", e);
}
return "文件上传成功";
}
文件下载
@GetMapping("/download")
@ResponseBody
public String fileDownload(@RequestParam("fileName") String fileName, HttpServletResponse response){
if (Objects.isNull(fileName)){
return "文件下载失败,请选择文件要下载的文件";
}
return fileManageService.download(fileName, response);
}
public String download(String fileName, HttpServletResponse response){
File file = new File(fileHostPath + fileName);
if (!file.exists()){
return "文件不存在";
}
byte[] bytes = new byte[SIZE];
BufferedInputStream bufferedInputStream = null;
OutputStream outputStream = null;
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
bufferedInputStream = new BufferedInputStream(fileInputStream);
response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());
response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
outputStream = response.getOutputStream();
int length;
while ((length = bufferedInputStream.read(bytes)) != -1){
outputStream.write(bytes, 0, length);
}
outputStream.flush();
}catch (Exception e){
LOGGER.error("文件下载失败", e);
}finally {
try {
if (bufferedInputStream != null){
bufferedInputStream.close();
}
if (outputStream != null){
outputStream.close();
}
if (fileInputStream != null){
fileInputStream.close();
}
}catch (IOException e){
LOGGER.error(e.getMessage(), e);
}
}
return "success";
}