1.导入相关pom以及配置文件路径
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.20</version>
</dependency>
<!--文件上传-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
用@Value来给需要的各种路径参数注入值
@Value("${file.path}")
private String filepath;
@Value("${server.ip}")
private String serverIp;
2.文件上传
解释说明:文件系统数据库设置MD5这个字段,MD5可以用来校验文件是否重复,重复就不上传,避免资源的浪费。同时在存储文件的同时还应该将文件各种类型参数写入数据库保存记录。
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IOException {
String url="";
//获取文件名
String originalFilename = file.getOriginalFilename();
//获取文件大小
long size = file.getSize();
//类型
String type = FileUtil.extName(originalFilename);
//创建父级目录
File uploadParentFile=new File(filepath);
if (!(uploadParentFile.exists())){
uploadParentFile.mkdir();
}
//防止重名 定义文件标识码
String uuid= IdUtil.simpleUUID();
File uploadFile=new File(filepath+"/"+uuid+'.'+type);
//获取文件MD5 校验是否重复文件
String md5= SecureUtil.md5(file.getInputStream());
//根据MD5去数据库校验是否存在
SysFile serviceMd5 = fileService.findMd5(md5);
//判断文件是否存在
if (serviceMd5==null){
//把获取file存入系统磁盘
file.transferTo(uploadFile);
url= "http://"+serverIp+":8081/file/"+uuid+'.'+type;
SysFile saveFile=new SysFile();
saveFile.setName(originalFilename);
saveFile.setType(type);
saveFile.setSize(size/1024);
saveFile.setUrl(url);
saveFile.setMd5(md5);
fileService.saveFile(saveFile);
}
else {
QueryWrapper<SysFile> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("md5", md5);
SysFile one = fileService.getOne(queryWrapper);
url=one.getUrl();
}
return url;
}
3.文件下载 根据UUID.文件类型 下载
//根据uuid下载文件
@GetMapping("/{fileUUID}")
public void downFile(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
//根据文件
File uploadFile=new File(filepath+"/"+fileUUID);
ServletOutputStream os=response.getOutputStream();
response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(fileUUID,"UTF-8"));
response.setContentType("application/octet-stream");
//读取文件字节流
os.write(FileUtil.readBytes(uploadFile));
os.flush();
os.close();
}