获取文件的MD5值
将文件切片进行md5,获得文件对应的md5值,用来准确校验文件是否改变。
-
浏览器端
import SparkMD5 from "spark-md5";
const fileMd5 = (file: File & Blob, callback: (md5: string) => void) => {
const blobSlice = File.prototype.slice;
const chunkSize = 2097152; // 2MB
const chunks = Math.ceil(file.size / chunkSize);
let currentChunk = 0;
const spark = new SparkMD5.ArrayBuffer();
const fileReader = new FileReader();
fileReader.onload = (e: any) => {
spark.append(e.target.result); // Append array buffer
currentChunk++;
if (currentChunk < chunks) {
loadNext();
} else {
const md5 = spark.end(); // 得到md5
spark.destroy(); // 释放缓存
callback(md5);
}
};
fileReader.onerror = () => {
console.warn("something went wrong.");
};
const loadNext = () => {
const start = currentChunk * chunkSize;
const end = start + chunkSize >= file.size ? file.size : start + chunkSize;
fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
};
loadNext();
};
-
node
import fs from "fs";
import crypto from "crypto";
const fileMd5 = (filePath: string): Promise<string> => {
return new Promise((resolve) => {
const stream = fs.createReadStream(filePath);
const hash = crypto.createHash("md5");
stream.on("data", (chunk: string) => {
hash.update(chunk, "utf8");
});
stream.on("end", () => {
const md5 = hash.digest("hex");
resolve(md5);
});
});
};