赞
踩
进来看这篇文章的朋友,应该都有做过文件上传的业务,也弄了文件重复的问题。通常的做法就是:
使用 MD5 消息摘要算出 文件摘要,作为文件名,判断重复的时候,去数据库比较一下。
但有没有发现一个问题就是,文件拿到服务器才能判断,判断重复了不要了呢,是不是白拿了,是不是有点浪费宽带和服务器内存啊,这是能优化的地方啊。
这个是最近在做文件处理的时候想到了这样的问题的。
还有一个问题,post表单文件,没读它是否也来到服务器了呢,或者我们读它才会流上来呢?
看一下这个类的api介绍:大概意思是请求上来的时候这个类就把文件缓存在内存或者磁盘,大文件会缓存到磁盘中,等待处理,请求结束才清除,很明显发起post请求 文件就来到服务器了
api
百度了一圈,好像都没什么相关的问题,都是教你怎么上传文件,然后在服务器上判断重复的问题的。是不是我想得太多了,这不是问题吗,不管了,我说我的想法就得了。
既然不让文件上到服务器,那就在前端了,在文件post之前,是不是可以先拿文件摘要上去,判断要不要post这个文件上去呢。
当然不应该只在前端判断,因为你的客户不是每个都是正常用户,你懂得,所以原来服务器的判断还是要的,前端 卡一部分文件请求还是有必要的,文件比通常post字符串信息 要大得太多。
怎么在前端取到文件摘要的问题:
js的MD5算法在网上有,代码我就不贴出来了,200行有点长,也有专门js插件,没必要 就一个方法而已。
js的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字符
测试结果如下:
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();}}
运行结果:
运行结果一样的,真正的业务逻辑再慢慢去组织了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。