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

最近在项目中遇到了大文件分割上传问题,为了保证上传的文件的有效性需要确保分割的文件上传首先要成功,因此用到了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值