前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >js计算出来的文件md5值跟java计算出来的不一致

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

作者头像
johnhuster的分享
发布2022-03-28 19:20:36
发布2022-03-28 19:20:36
3.7K00
代码可运行
举报
文章被收录于专栏:johnhusterjohnhuster
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
复制
  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){  
        
        //debugge
       });                  
            });                     
}    

使用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相关文件如下:

代码语言:javascript
代码运行次数:0
运行
复制
 <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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/11/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档