获取文件的MD5值

3,764 阅读1分钟

获取文件的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);
        });
    });
};