今天碰到一个比较棘手的问题,经理要求上传文件同时上传文件的信息,信息包含文件的md5,后台会做文件完整性校验等,我用的跟以前一样的md5.js直接把在fileReader.onload中获取的文件流进行md5操作(代码如下),
$("#file1").change(function() {
var file = document.getElementById("file1").files[0];
var fileReader = new FileReader();
fileReader.readAsBinaryString(file);
fileReader.onload = function(e) {
console.log(md5(e.target.result)))
}
})
上传后报错,拿到后台生成的md5值进行比对发现跟我生成的不一样,网上找了N久最后发现是因为在js中是利用UTF-16编码的,而大多数计算md5值的方案都是基于二进制流的, 所以需要将js读出来的二进制流(已经被转换成UTF-16编码)还原成二进制流。最后的解决办法用的google的加密文件CryptoJS还原后再加密,下载地址:https://github.com/brix/crypto-js。下载后有N个文件,只需要以下两个文件就可以了。
上面代码改成
$("#file1").change(function() {
var file = document.getElementById("file1").files[0];
var fileReader = new FileReader();
fileReader.readAsBinaryString(file);
fileReader.onload = function(e) {
console.log(CryptoJS.MD5(CryptoJS.enc.Latin1.parse(e.target.result)))
//CryptoJS.enc.Latin1.parse(text)此方法是把文件还原成二进制流
}
})