大文件分片上传

import SparkMD5 from ''; // 导入MD5计算文件哈希
const CHUNK_SIZE = 1024 * 1024 * 5; // 5MB
const THREAD_COUNT = navigator.hardwareConcurrency || 4;// cpu核心数

const function createChunk(file, chunkIndex, CHUNK_SIZE) {
  return new Promise((resolve) => {
    const start = chunkIndex * CHUNK_SIZE;
    const end = Math.min(file.size, start + CHUNK_SIZE);
    const spark = new SparkMD5.ArrayBuffer();
    const fileReader = new FileReader();
    const blob = file.slice(start, end);
    fileReader.onload = function (e) {
      spark.append(e.target.result);
      resolve({
        start,
        end,
        chunkIndex,
        hash: spark.end(),
        blob
      })
    }
  });
  fileReader.readAsArrayBuffer(blob);
}

const function cutFile(file) {
  return new Promise((resolve) => {
    const chunkCount = Math.ceil(file.size / CHUNK_SIZE);
    const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT);
    const start = i * threadChunkCount;
    const end = (i + 1) * threadChunkCount > chunkCount ? chunkCount : (i + 1) * threadChunkCount;
    const result = [];
    let finishCount = 0;
    for (let i = 0; i < THREAD_COUNT; i++) {
      // 创建一个线程,分配任务
      const worker = new Worker(async (e) => {
        const {
          file,
          CHUNK_SIZE,
          startChunkIndex: start,
          endChunkIndex: end
        } = e.data;

        const proms = [];
        for (let i = start; i < end; i++) {
          proms.push(createChunk(file, i, CHUNK_SIZE));
        }
        const chunks = await Promise.all(proms);
        postMessage(chunks);
      }, {
        type: 'module'
      })
    };

    worker.postMessage({
      file,
      CHUNK_SIZE,
      startChunkIndex: start,
      endChunkIndex: end
    });

    worker.onmessage = e => {
      for (let i = start, ; i < end; i++) {
        result[i] = e.data[i - start];
      }
      worker.terminate();// 结束线程
      finishCount++;
      if (finishCount === THREAD_COUNT) {
        resolve(result)
      }
    }
  });
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值