计算文件MD5

155 阅读1分钟

spark-md5

import SparkMD5 from "spark-md5";

// 分片大小(8MB)
const chunkSize = 8388608;

/**
 * 计算文件MD5
 *
 * @param {*} file
 * @param {*} progress
 * @returns
 */
export function md5(file, progress) {
  let blobSlice =
    File.prototype.slice ||
    File.prototype.mozSlice ||
    File.prototype.webkitSlice;

  let totalChunk = Math.ceil(file.size / chunkSize.value);
  let currentChunk = 0;
  let spark = new SparkMD5.ArrayBuffer();
  let fileReader = new FileReader();

  // 当有数据载入时
  fileReader.onload = (e) => {
    spark.append(e.target.result);
    currentChunk++;

    if (progress) {
      let progressValue = currentChunk / totalChunk;
      let progressPercentValue = parseFloat((progressValue * 100).toFixed(2));
      progress(progressPercentValue);
    }

    if (currentChunk < totalChunk) {
      loadNext();
    } else {
      return Promise.resolve(spark.end());
    }
  };

  // 当发生错误时
  fileReader.onerror = () => {
    return Promise.reject();
  };

  function loadNext() {
    let beginIndex = currentChunk * chunkSize.value;
    let endIndex = beginIndex + chunkSize.value;
    if (endIndex >= file.size) {
      endIndex = file.size;
    }

    fileReader.readAsArrayBuffer(blobSlice.call(file, beginIndex, endIndex));
  }

  loadNext();
}