近期的项目中接到一个需求,文件上传时,如果是重复文件,直接将文件路径复制一份,不去真的上传。
背景:
文件服务器选择的是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);
经验证,两种方式加密的结果一样。

总结:
两种方案均可以实现需求,我个人倾向于选择方案一,简单。
本文介绍了一种在使用FastDFS作为文件服务器时,通过计算上传文件的MD5值来判断文件是否重复的方法,从而避免重复上传,提高效率。提供了两种计算MD5值的实现方案,并对比了它们的异同。

1064

被折叠的 条评论
为什么被折叠?



