js-spark-md5 计算文件MD5值

551 阅读1分钟

背景

最近遇到了新需求,上传图片需要用文件MD5作为文件名。所以了解并使用了[js-spark-md5](satazor/js-spark-md5: Lightning fast normal and incremental md5 for javascript (github.com))来计算文件的MD5值,下面就来介绍如何使用。

安装

yarn add spark-md5

使用

封装工具函数

import SparkMD5 from "spark-md5"

/**
 * 计算文件MD5
 * @param file File
 * @returns
 */
export function fileMD5(file) {
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader()

    if (Math.ceil(file.size / 1024) < 20) {
      fileReader.readAsBinaryString(file)
      fileReader.onload = (e) => {
        resolve(SparkMD5.hashBinary(e.target?.result))
      }
    } else {
      const sliceLength = 10
      const chunkSize = Math.ceil(file.size / sliceLength)
      const md5 = new SparkMD5()
      let index = 0
      const loadFile = () => {
        const slice = file.slice(index, index + chunkSize)
        fileReader.readAsBinaryString(slice)
      }
      loadFile()
      fileReader.onload = (e) => {
        md5.appendBinary(e.target?.result)
        if (index < file.size) {
          index += chunkSize
          loadFile()
        } else {
          resolve(md5.end())
        }
      }
    }

    fileReader.onerror = (e) => {
      reject(e)
    }
  })
}

代码解析

使用FileReaderreadAsBinaryString()方法读取文件内容,再调用SparkMD5.hashBinary()方法直接获取返回的md5内容,如果文件较大,则采用分片方式获取md5增加性能。