js encrypt the file section, large file encryption seconds
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<div>
上传文件 : <input type="file" name="file" id="fileId"/>
<button type="submit" name="btn" value="提交" id="btnId" onclick="check('fileId')"/>
</div>
<!--设置成自己的md5-->
<script src="https://blog-static.cnblogs.com/files/tyler-bog/md5.js"></script>
<script>
// 生成MD5的函数
function md5s(str) {
var MD5 = new Hashes.MD5().hex(str)
return MD5
}
// Button按钮点击调用此函数。fileId为上传文件input的id值
function check(fileId, split_num = 32, get_byte = 64) {
var info = new String;
var sum=0;
/*fileId:input上传文件的id
split_num: 需要分割生成MD5的数量,默认32
get_byte: 每段需要取的字节个数,默认64字节
小于2MB的文件直接MD5*/
// 判断 split_num和get_byte 是否为数字
// 定义文件对象
var objFile = document.getElementById(fileId);
// 判断文件书否为空
if (objFile.value == "") {
alert("文件不能为空空");
return false;
}
var blob = objFile.files[0];
// 定义常量 const ,不可修改
// 获取文件的总大小
const size = blob.size;
// 计算每段的大小
const mean_size = Math.floor(size / split_num);
// 判断文件大小,如果小于 split_num * get_byte 就直接MD5
if (size < split_num * get_byte) {
var read = new FileReader(); //创建读取器对象FileReader
read.readAsBinaryString(blob); //开始读取文件
read.onload = function () { //数据读完会触发onload事件
res_md5 = md5s(read.result); // read有个result属性存放这结果,从result获取到数据,再md5加密
console.log(res_md5); // 得到md5值
return res_md5
}
} else {
var start = 0; // 定义开始位置
var end = get_byte; // 定义截取结束位置
while (start < size) {
var read = new FileReader(); //创建读取器对象FileReader
blobs = blob.slice(start, end); //创建Blob对象
read.readAsText(blobs); //开始读取文件
start = start + mean_size; // 下一段开始位置
end = start + get_byte; // 定义截取结束位
read.onload = function (aa) { //数据读完会触发onload事件
sum += 1;
info = info + aa.currentTarget.result; //read有个result属性存放这结果,从result获取到数据,再拼接字符
if (sum === split_num){
res_md5 = md5s(info); //进行加密
info =null;
console.log(res_md5); // 得到md5值
return res_md5
}
};
}
}
}
</script>
</body>
</html>