上传
/**
* 文件上传
*/
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IOException {
//
if (file.isEmpty()) {
return "上传失败,请选择文件!!!";
}
String originalFilename = file.getOriginalFilename();
String type = FileUtil.extName(originalFilename);
long size = file.getSize();
//先存储到磁盘
File uploadParentFile = new File(FilesUploadPath);
//判断配置的文件目录是否存在,若不存在则创建一个新的文件目录
if (!uploadParentFile.exists()) {
uploadParentFile.mkdirs();
}
//定义一个文件唯一的标识码
String uuid = IdUtil.fastSimpleUUID();
String fileUuid = uuid + StrUtil.DOT + type;
File uploadFiles = new File(FilesUploadPath + fileUuid);
String url ;
//上传文件到磁盘
file.transferTo(uploadFiles);
//当文件存在的时候获取文件的md5
String md5 = SecureUtil.md5(uploadFiles);
//从数据库查询是否存在相同的记录
Files one = getFileMd5(md5);
//获取文件的url
if(one !=null){
//如果不等于空直接返回原来的地址,防止浪费
url=one.getUrl();
//由于文件已存在,所以删除刚才上传的重复文件
uploadFiles.delete();
}
else{
//数据库若不存在,则不删除
url="http://"+serverIp+":8888/files/" + fileUuid;
}
//查询文件md5是否存在
//存储数据库
Files files = new Files();
files.setName(originalFilename);
files.setType(type);
files.setSize(size/1024);
files.setUrl(url);
files.setMd5(md5);
return url;
}
//通过文件的md5查询文件
private Files getFileMd5(String md5){
QueryWrapper<Files> filesQueryWrapper = new QueryWrapper<>();
filesQueryWrapper.eq("md5",md5);
List<Files> list = filesService.list(filesQueryWrapper);
return list.size() ==0 ? null : list.get(0);
}
下载
@GetMapping("/{fileUuid}")
public void download(@PathVariable String fileUuid, HttpServletResponse response) throws IOException {
//根据文件的唯一标识码获取文件
File uploadFiles = new File(FilesUploadPath + fileUuid);
//设置输出流的格式
ServletOutputStream os = response.getOutputStream();
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileUuid, "UTF-8"));
response.setContentType("application/octet-stream");
//读取文件的字节流
os.write(FileUtil.readBytes(uploadFiles));
os.flush();
os.close();
}