您的位置:首页 > 编程语言 > Java开发

js计算出来的文件md5值跟java计算出来的不一致

2017-11-30 15:14 471 查看
最近在项目中遇到了大文件分割上传问题,为了保证上传的文件的有效性需要确保分割的文件上传首先要成功,因此用到了md5加密,在js代码中上传文件之前将要上传的文件内容进行md5加密,然后作为其中一个参数传到后端服务器,后端再收到文件后对文件进行同样的md5加密,然后将两个md5值对比,验证成功则人为文件分割块是正确的,然后保存,但是却遇到一个问题:

笔者最初使用的是jquery.MD5.js这个库进行加密,尝试对几个字符串加密后与java端产生的相同,但是上传文件时却md5校验失败,最终发现问题出在下面:

  function uploadFile1(blob, index, start, end,fileSize) {
var xhr;
var fd;
var chunk;  
var sliceIndex=blob.name+index;
chunk =blob.slice(start,end);//切割文件 
fd = new FormData();
fd.append("filedata", chunk,blob.name);
var params = {};
params.range = 'bytes ' + start + '-' +
                    (end - 1) + '/' + fileSize;
            var f=new FileReader();  
            f.readAsBinaryString(chunk);  
            $(f).load(function(e){  
                var fileAllMd5=e.target.result;  
                var md5 = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(fileAllMd5)).toString();//$.md5(fileAllMd5);
                //console.log(fileAllMd5);
                params.md5 = md5;
                fd.append("params",JSON.stringify(params));
       $.ajax({  
           url: url,  
           type: 'POST',  
           data: fd,
           "async":false,
           dataType: 'JSON',  
           cache: false,  
           processData: false,  
           contentType: false  
       }).done(function(ret){  
       

       
//debugger
       });                  
            });                     
}  

使用FileReader读取文件内容为利用UTF-16编码的,但是md5插件在计算md5值时是基于二进制流的,因此需要将FileReader读出来的二进制流(已经被转换成UTF-16编码)还原成二进制流。latin—1编码同二进制流,所以将js流转换成latin—1编码即可,最终用到了谷歌的crypto-js库,github地址为:https://github.com/jakubzapletal/crypto-js

最终由于jquery.md5插件与crypto-js兼容性问题,放弃jquery.md5插件使用crypto-js插件,相关部分代码见上面代码标红部分!

注:上面用到的crypto-js相关文件如下:

<script
src="xx/crypto-js/core.js"></script>

<script src="xx/crypto-js/enc-base64.js"></script>

<script src=".xx/crypto-js/enc-utf16.js"></script>

<script src="xx/crypto-js/md5.js"></script>

参考:http://blog.csdn.net/butcher5351750/article/details/24402025
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: