java文件上传判断是否重复,不需要文件请求上去就能判断

进来看这篇文章的朋友,应该都有做过文件上传的业务,也弄了文件重复的问题。通常的做法就是:

使用 MD5 消息摘要算出 文件摘要,作为文件名,判断重复的时候,去数据库比较一下。

但有没有发现一个问题就是,文件拿到服务器才能判断,判断重复了不要了呢,是不是白拿了,是不是有点浪费宽带和服务器内存啊,这是能优化的地方啊。

这个是最近在做文件处理的时候想到了这样的问题的。

还有一个问题,post表单文件,没读它是否也来到服务器了呢,或者我们读它才会流上来呢?

看一下这个类的api介绍:大概意思是请求上来的时候这个类就把文件缓存在内存或者磁盘,大文件会缓存到磁盘中,等待处理,请求结束才清除,很明显发起post请求 文件就来到服务器了

java文件上传判断是否重复,不需要文件请求上去就能判断

api

百度了一圈,好像都没什么相关的问题,都是教你怎么上传文件,然后在服务器上判断重复的问题的。是不是我想得太多了,这不是问题吗,不管了,我说我的想法就得了。

既然不让文件上到服务器,那就在前端了,在文件post之前,是不是可以先拿文件摘要上去,判断要不要post这个文件上去呢。

当然不应该只在前端判断,因为你的客户不是每个都是正常用户,你懂得,所以原来服务器的判断还是要的,前端 卡一部分文件请求还是有必要的,文件比通常post字符串信息 要大得太多。

怎么在前端取到文件摘要的问题:

js的MD5算法在网上有,代码我就不贴出来了,200行有点长,也有专门js插件,没必要 就一个方法而已。

java文件上传判断是否重复,不需要文件请求上去就能判断

js的MD5算法

前端拿到文件的MD5:

var objFile = document.getElementById("myfile");
var reader = new FileReader(); //文件加载器
reader.onload = function(evt){ //绑定一个文件加载完成事件
var fileString = evt.target.result; // 读取文件内容
console.log(MD5(fileString));
}
reader.readAsBinaryString(objFile.files[0]) ; //开始读取文件的二进制成01字符

测试结果如下:

java文件上传判断是否重复,不需要文件请求上去就能判断

后端java获取得到的摘要:

public static void main(String[] args) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
FileInputStream fis = new FileInputStream("tx.jpeg");
byte[] data = new byte[10*1024];
int l = -1;
while((l=fis.read(data))!=-1) {
md5.update(data, 0, l);
}
byte[] mdbs = md5.digest();
fis.close();
for (byte b : mdbs) {
System.out.print(Integer.toHexString(b&0xff));
}
} catch (Exception e) {
e.printStackTrace();
}
}

运行结果:

java文件上传判断是否重复,不需要文件请求上去就能判断

运行结果一样的,真正的业务逻辑再慢慢去组织了

java上传文件 Java http 数据库 算法 缓存
分享到:

您可能还会对下面的文章感兴趣: