近期的项目中接到一个需求,文件上传时,如果是重复文件,直接将文件路径复制一份,不去真的上传。
背景:
文件服务器选择的是Fastdfs,数据库中有一个对应的File表保存文件存储路径以及MD5值。
思路:
要判断文件是否重复,就需要对每次上传的文件计算MD5值,上传前通过查询文件库中是否存在该MD5值,来判断是选择上传还是直接复制已存在的文件路径。
方法一:
使用org.apache.commons.codec.digest.DigestUtils
类,一行代码搞定。
// 获取上传文件的MD5值
String md5 = DigestUtils.md5Hex(file.getBytes());
// 判断该文件是否在文件服务器上存在
List<String> filepathList = fileService.FileMd5IsExit(md5);
// 存放文件路径
String path = null;
if (CollectionUtils.isNotEmpty(filepathList)) {
path = filepathList.get(0);
} else {
// 文件上传
path = fileStore.saveFile(file.getBytes(), extension);
}
方法二:
java.security.MessageDigest
java自带的加密类
// 获取上传文件的MD5值
InputStream inputStream = file.getInputStream();
byte[] buffer = new byte[1024];
int length = -1;
while ((length = inputStream.read(buffer, 0, 1024)) > 0) {
messageDigest.update(buffer, 0, length);
}
inputStream.close();
String md52 = new BigInteger(1, messageDigest.digest()).toString(16);
经验证,两种方式加密的结果一样。
总结:
两种方案均可以实现需求,我个人倾向于选择方案一,简单。