使用spark-md5获取文件的MD5值

5,781 阅读1分钟

初始化资源

npm install --save spark-md5
 let SparkMD5 = require('spark-md5')

1.一般文件

一种是用SparkMD5.hashBinary() 直接将整个文件的二进制码传入,直接返回文件的md5。

2.体积较大的文件

这里采用分片上传的方式:

一般我们做上传的时候推荐使用着一种方式,因为文件的体积不确定,这种方式对于大体积的文件计算更加稳定,还可以获得计算进度的信息。

function md5(file, chunkSize) {
    let _this = this
    return new Promise((resolve, reject) => {
      let blobSlice =
        File.prototype.slice ||
        File.prototype.mozSlice ||
        File.prototype.webkitSlice;
      let chunks = Math.ceil(file.size / chunkSize);
      let currentChunk = 0;
      let spark = new SparkMD5.ArrayBuffer(); //追加数组缓冲区。
      let fileReader = new FileReader(); //读取文件
      fileReader.onload = function (e) {
        spark.append(e.target.result);
        currentChunk++;
        _this.md5Obj.percent = Math.floor((currentChunk / chunks) * 100);
        _this.container.file.MD5Progress = _this.md5Obj.percent
        if (_this.onMD5Progress(_this.container.file) === false) return;
        if (currentChunk < chunks) {
          loadNext();
        } else {
          _this.md5Obj.md5 = spark.end(); //完成md5的计算,返回十六进制结果。
          resolve(_this.md5Obj);
        }
      };

      fileReader.onerror = function (e) {
        reject(e);
      };

      function loadNext() {
        let start = currentChunk * chunkSize;
        let end = start + chunkSize;
        (end > file.size) && (end = file.size);
        fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
      }
      loadNext();
    });
  }

调用:

      md5.call(this, file, this.chunkSize)
        .then(res => {
          // 获取到文件的md5
          setDatas.call(this, 'params.md5', res.md5);
          if (this.autoUpload) {
            if (this.onStartUpload(this.container.file) === false) return;
            handleUpload.call(this);
          }
        })
        .catch(res => {
          // 处理异常
          console.error(res);
        });//