最近在做大文件上传,需要给文件生成hash名称,一开始用的crypto.subtle.digest(algorithm, buffer) 但是发现上传到测试环境报错了,经查询发现windows.crypto需要在本地和https生产环境中使用,感谢该文章的提醒@noble/secp256k1的crypto.subtle undefined问题 - 简书
后续改为用第三方库crypto-js
替代 crypto.subtle
来计算文件的哈希值,方法如下
calculateFileHash(file, algorithm = 'SHA-256') {
return new Promise((resolve, reject) => {
const reader = new FileReader();
const slice = file.slice(0, 100 * 1024 * 1024); // 只读取前100MB
reader.onload = (e) => {
const buffer = e.target.result;
// 将 ArrayBuffer 转换为 WordArray
const wordArray = CryptoJS.lib.WordArray.create(buffer);
// 根据选择的算法计算哈希
let hash;
if (algorithm === 'SHA-256') {
hash = CryptoJS.SHA256(wordArray);
} else if (algorithm === 'SHA-1') {
hash = CryptoJS.SHA1(wordArray);
} else if (algorithm === 'MD5') {
hash = CryptoJS.MD5(wordArray);
} else {
return reject(new Error("Unsupported hash algorithm"));
}
// 将哈希结果转换为十六进制字符串
const hashHex = hash.toString();
resolve(hashHex);
};
reader.onerror = reject;
reader.readAsArrayBuffer(slice);
});
},