- 所需依赖
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 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>
- 数据表结构
1.新建Files实体类
2.在 application.yml 配置文件下载保存路径
files:
upload:
path: D:\Biancheng\IdeaProject\Spring-Vue-practice\file
3.创建FileMapper接口 继承BaseMapper<对应实体类>
@Mapper
public interface FileMapper extends BaseMapper<Files> {
}
4.在Controller层 创建 FileController 实现文件上传 下载
@RestController
@RequestMapping("/file")
public class FileController {
@Value("${files.upload.path}")
private String fileUploadPath;
@Resource
private FileMapper fileMapper;
/**
* 文件上传接口
*
* @Param file 前端传过来的文件
*/
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IOException {
//获取文件名称
String originalFilename = file.getOriginalFilename();
//获取文件类型
String type = FileUtil.extName(originalFilename);
//获取文件大小
long size = file.getSize();
//文件上传的目标路径或目录
File uploadParentFile = new File(fileUploadPath);
//判断配置文件上传的目标路径或目录是否存在,不存在则创建一个文件目录
if (!uploadParentFile.exists()) {
uploadParentFile.mkdirs();
}
//定义一个文件唯一标识码
String uuid = IdUtil.fastSimpleUUID();
String fileUUID = uuid + StrUtil.DOT + type;
File uploadFile = new File(fileUploadPath + File.separator + fileUUID);
//把获取到的文件路径存储到磁盘目录
file.transferTo(uploadFile);
//获取文件的md5
String md5 = SecureUtil.md5(uploadFile);
//从数据库查询是否存在相同的记录
Files dbFiles = getFileByMd5(md5);
String url;
if (dbFiles != null) {
url = dbFiles.getUrl();
//由于文件已经存在,所以删除刚才上传的重复文件
uploadFile.delete();
} else {
//数据库若不存在重复文件,则不删除刚才上传的文件
url = "http://localhost:8100/file/" + fileUUID;
}
//存储到数据库
Files saveFile = new Files();
saveFile.setName(originalFilename);
saveFile.setType(type);
saveFile.setSize(size / 1024);
saveFile.setUrl(url);
saveFile.setMd5(md5);
fileMapper.insert(saveFile);
return url;
}
//用md5从数据库查询是否存在相同的记录
public Files getFileByMd5(String md5) {
QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("md5", md5);
List<Files> filesList = fileMapper.selectList(queryWrapper);
return filesList.size() == 0 ? null : filesList.get(0);
}
/**
* 文件下载接口 http://localhost:8100/file/{fileUUID}
*
* @param fileUUID
* @param response
* @throws IOException
*/
@GetMapping("/{fileUUID}")
public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
//根据文件的唯一标识码获取文件
File uploadFile = new File(fileUploadPath + File.separator + 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(uploadFile));
os.flush();
os.close();
}
}
5.接口测试(上传 下载)
上传:
下载: