一、文件md5计算:
参考:https://github.com/forsigner/browser-md5-file
1、引入 spark-md5
npm install --save spark-md5
2、创建 md5.js
import SparkMD5 from 'spark-md5'
export default class BMF {
md5(file, md5Fn, progressFn) {
this.aborted = false
this.progress = 0
let currentChunk = 0
const blobSlice =
File.prototype.slice ||
File.prototype.mozSlice ||
File.prototype.webkitSlice
const chunkSize = 2097152
const chunks = Math.ceil(file.size / chunkSize)
const spark = new SparkMD5.ArrayBuffer()
const reader = new FileReader()
loadNext()
reader.onloadend = e => {
spark.append(e.target.result) // Append array buffer
currentChunk++
this.progress = currentChunk / chunks
if (progressFn && typeof progressFn === 'function') {
progressFn(this.progress)
}
if (this.aborted) {
md5Fn('aborted')
return
}
if (currentChunk < chunks) {
loadNext()
} else {
md5Fn(null, spark.end())
}
}
/
function loadNext() {
const start = currentChunk * chunkSize
const end = start + chunkSize >= file.size ? file.size : start + chunkSize
reader.readAsArrayBuffer(blobSlice.call(file, start, end))
}
}
abort() {
this.aborted = true
}
}
3、使用
import BMF from '@trantor/share/utils/md5';
const bmf = new BMF();
calMD5(file) {
return new Promise((resolve, reject) => {
bmf.md5(this._file, (err, md5) => {
if (err) {
reject(err);
} else {
resolve(md5);
}
});
});
}
const fileMd5 = await calMD5(file);
console.log('文件md5', fileMd5);
二、文件sha1计算:
sha1的计算方法:先初始化,然后读取数据,不停的update,最后所有数据都计算完,final一下,得到最终结果
对于大文件,其实计算的还是整个文件所有数据的sha1,只是因为文件太大,肯定不能一口气把整个文件读取到内存里直接计算,是一边读一边算,最终得到的结果还是整个文件的sha1