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
總結
以上是生活随笔為你收集整理的js计算出来的文件md5值跟java计算出来的不一致的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SELCO T2900.0010有一种保
- 下一篇: 三谈 钉钉、企微、飞书 的不同:优势即劣