Spring Boot整合Hutool实现防止文件重复上传
1.需要先搭建Spring Boot工程
2.引入hutool工具类依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4</version>
</dependency>
文档:Spring MVC的MultipartFile接口常用API
方法 | 功能描述 |
---|---|
String getOriginalFilename() | 获取上传文件的原始文件名,即该文件在客户端中的文件名 |
boolean isEmpty() | 判断上传的文件是否为空,当没有选择文件就直接上传,或者选中的文件是0字节的空文件时,返回true,否则返回false |
long getSize() | 获取上传的文件大小,以字节为单位 |
String getContentType() | 根据所上传的文件的扩展名决定该文件的MIME类型,例如上传.jpg格式的图片,将返回image/jpeg |
InputStream getInputStream() | 获取上传文件的输入字节流,通常用于自定义读取所上传的文件的过程,该方法与transferTo()方法不可以同时使用 |
void transferTo(File dest) | 保存上传的文件,该方法与getInputStream()方法不可以同时使用 |
核心代码
/**
* description 文件上传
*
* @return {@link AjaxResult}
* @param: [multipartFile]
* @Date 2022/7/16
*/
@PostMapping("fileUpload")
public String fileUpload(MultipartFile multipartFile) throws IOException {
String PATH = "D:\\file\\";
log.info("multipartFile:{}", multipartFile);
//判断上传的文件是否为空
if (multipartFile ==null || multipartFile.isEmpty()){
return "请选选择文件再上传,参数名multipartFile";
}
String contentType = multipartFile.getContentType();
log.info("文件类型:{}",contentType);
//获取文件名
String fileName = multipartFile.getOriginalFilename();
//获取文件后缀名 没有点符号
String fileSuffix = FileUtil.extName(fileName);
//限制文件类型
if (!(fileSuffix.equals("jpg") || fileSuffix.equals("png") || fileSuffix.equals("xls") || fileSuffix.equals("xlsx"))) {
return "当前只支持上传:jpg png xls xlsx类型";
}
//获取文件大小
long size = multipartFile.getSize();
//使用时间戳+3位随机数作为新的文件名
long milli = Instant.now().toEpochMilli();
String randomNumbers = RandomUtil.randomNumbers(3);
//生成新的文件名
String newFileName = milli + randomNumbers + "." + fileSuffix;
//创建文件夹,如果存在则不创建
FileUtil.mkdir(PATH);
//文件路径
String filePath = PATH + newFileName;
//生成文件唯一has256值
String shaValue = DigestUtil.sha256Hex(multipartFile.getBytes());
//相同的文件每次上传has256值都是一样的,可以根据该值判断文件是否存在
if (shaValue.equals("数据库中的has256值")) {
return "改文件已存在";
}
log.info("has256:{}", shaValue);
try {
//实现文件存储
FileUtil.writeBytes(multipartFile.getBytes(), filePath);
return "文件上传成功";
} catch (IOException e) {
log.error("文件上传失败 报错信息:{}", e);
return "文件上传失败,错误信息:" + e;
}
}
yml
参数作用如下:
spring.servlet.multipart.enabled:表示是否开启文件上传支持,默认为 true
spring.servlet.multipart.file-size-threshold:表示文件写入磁盘的阀值,默认为 0
spring.servlet.multipart.location:表示上传文件的临时保存位置
spring.servlet.multipart.max-file-size:表示上传的单个文件的最大大小,默认为 1MB
spring.servlet.multipart.max-request-size:表示多文件上传时文件的总大小,默认为 10MB
spring.servlet.multipart.resolve-lazily:表示文件是否延迟解析,默认为 false
spring:
servlet:
multipart:
max-file-size: 20MB
max-request-size: 200MB
文件上传到这里就结束了
ps:如果后面需要物理删除文件可以调用以下Api
//删除单个文件
FileUtil.del("D:\\file\\test.txt");
//删除整个文件夹(慎用)
FileUtil.del(D:\\file\\)