前端分片上传及生成MD5

const CHUNK_MD5_SIZE = 50 * 1024 * 1024; // MD5 分片大小
// 使用 spark-md5

import SparkMD5 from "spark-md5";

function getFilesSparkMd5(file) {
  return new Promise((resolve, reject) => {
    let currentPosition = 0; // 当前读取位置
    const fileReader = new FileReader();
    const spark = new SparkMD5.ArrayBuffer();
    // 逐块读取文件内容并计算MD5
    const processChunk = (chunk) => {
      return new Promise((resolve, reject) => {
        spark.append(chunk);
        currentPosition += chunk.byteLength;
        resolve();
      });
    };
    // 读取下一个块
    const loadNextChunk = () => {
      const fileSlice = file.slice(
        currentPosition,
        currentPosition + CHUNK_MD5_SIZE
      );
      fileReader.readAsArrayBuffer(fileSlice);
    };
    // file  Reader onload
    fileReader.onload = (e) => {
      const chunk = e.target.result;
      if (chunk) {
        processChunk(chunk).then(() => {
          if (currentPosition < file.size) {
            loadNextChunk();
          } else {
            resolve(spark.end());
          }
        });
      }
      spark.append(e.target.result);
      let md5 = spark.end();
      resolve(md5);
    };
    // file  Reader onerror
    fileReader.onerror = (err) => {
      reject(err.target.error);
    };
    // 开始读取第一个块
    loadNextChunk();
  });
}

// 同步调用
async function uploadFile(file){
    await md5 =  getFilesSparkMd5(file)
}

//使用 CryptoJS 

import CryptoJS from "crypto-js";
function getFilesCryptoJSMD5(file) {
  return new Promise((resolve, reject) => {
    let currentPosition = 0; // 当前读取位置
    const fileReader = new FileReader();
    const md5 = CryptoJS.algo.MD5.create();

    // 逐块读取文件内容并计算MD5
    const processChunk = (chunk) => {
      return new Promise((resolve, reject) => {
        const wordArray = CryptoJS.lib.WordArray.create(chunk);
        md5.update(wordArray);
        currentPosition += chunk.byteLength;
        resolve();
      });
    };

    // 读取下一个块
    const loadNextChunk = () => {
      const fileSlice = file.slice(
        currentPosition,
        currentPosition + CHUNK_MD5_SIZE
      );
      fileReader.readAsArrayBuffer(fileSlice);
    };

    // fileReader onload
    fileReader.onload = (e) => {
      const chunk = e.target.result;
      if (chunk) {
        processChunk(chunk).then(() => {
          if (currentPosition < file.size) {
            loadNextChunk();
          } else {
            const md5Hash = md5.finalize().toString();
            resolve(md5Hash);
          }
        });
      }
    };

    // fileReader onerror
    fileReader.onerror = (err) => {
      reject(err.target.error);
    };

    // 开始读取第一个块
    loadNextChunk();
  });
}

// 同步调用
async function uploadFile(file){
    await md5 =  getFilesCryptoJSMD5(file)
}

二者区别
 

SparkMD5crypto-js都是用于生成MD5哈希的JavaScript库,但它们之间存在一些区别:

  1. 库大小:

     

    SparkMD5是一个专门用于生成MD5哈希的轻量级库,它的文件大小相对较小(约为10KB)。而crypto-js是一个更加全面的加密库,它包含了许多其他加密算法(如SHA-1、SHA-256、SHA-512等),因此文件大小相对较大(约为200KB)。

  2. 浏览器支持:

     

    SparkMD5专为浏览器环境设计,它可以在浏览器中直接使用,而无需额外的配置。而crypto-js在浏览器环境中也可以使用,但需要使用<script>标签引入库文件,而不是通过import语句导入。

  3. API设计:

     

    SparkMD5的API设计简单易用,可以直接调用SparkMD5.hash()方法生成MD5哈希。而crypto-js的API设计更加复杂,需要使用CryptoJS.MD5()方法生成MD5哈希,并调用toString()方法将哈希值转换为字符串。

  4. 兼容性:

     

    SparkMD5crypto-js都支持现代浏览器和Node.js环境。但是,crypto-js在某些较旧的浏览器中可能存在兼容性问题。

  5. 我的开发项目中 文件需要再Linux 系统中解压 SparkMD5 生成的MD5 和Linux系统生成的MD5不一致,crypto-js 和 java Linux对于同一个文件生成了相同的MD5

总之,SparkMD5crypto-js都是用于生成MD5哈希的JavaScript库,但它们在库大小、浏览器支持、API设计和兼容性方面存在一些区别。在选择使用哪个库时,您需要根据项目需求和技术栈来权衡这些因素。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件分片上传前后端可以通过MD5加密来保证文件传输的完整性和准确性。 前端上传文件之前,可以通过如下代码计算文件MD5值: ```javascript function getFileMD5(file) { return new Promise((resolve, reject) => { const fileReader = new FileReader() const spark = new SparkMD5.ArrayBuffer() const chunkSize = 2097152 // 每个分片的大小为2MB let currentChunk = 0 fileReader.onload = e => { spark.append(e.target.result) // 对每个分片进行MD5计算 currentChunk++ if (currentChunk < chunks) { loadNext() } else { const result = spark.end() resolve(result) } } fileReader.onerror = () => { reject('文件读取失败') } const chunks = Math.ceil(file.size / chunkSize) function loadNext() { const start = currentChunk * chunkSize const end = start + chunkSize > file.size ? file.size : start + chunkSize const blob = file.slice(start, end) fileReader.readAsArrayBuffer(blob) } loadNext() }) } ``` 后端在接收到文件分片之后,可以对每个分片进行MD5计算,最后将所有分片MD5值进行合并,得到整个文件MD5值,如下所示: ```python import hashlib def get_file_md5(file): md5_obj = hashlib.md5() chunk_size = 2097152 # 每个分片的大小为2MB current_chunk = 0 while True: chunk = file.read(chunk_size) if not chunk: break md5_obj.update(chunk) current_chunk += 1 file.seek(0) return md5_obj.hexdigest() def merge_md5(md5_list): md5_obj = hashlib.md5() md5_list.sort() for md5 in md5_list: md5_obj.update(md5.encode()) return md5_obj.hexdigest() ``` 前端文件MD5值和文件分片一起上传到后端,后端在接收到所有分片之后,将所有分片MD5值进行合并,得到整个文件MD5值,并与前端传过来的MD5值进行比较,如果相同,则说明文件传输完整无误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值