CutFile.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const CHUNK_SIZE = 1024*1024*5 // 5MB
  2. const THREAD_COUNT = 12// 线程数量设置
  3. /**
  4. * 将文件切片
  5. * @param file
  6. * @returns {Promise<void>}
  7. */
  8. export function cutFile(file){
  9. return new Promise((resolve, reject)=>{
  10. const chunkCount = Math.ceil(file.size / CHUNK_SIZE);
  11. const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT);
  12. let finishedCount = 0 ;// 记录完成的线程数量
  13. let result = []; // 存储分片结果
  14. for(let i = 0 ; i<Math.min(THREAD_COUNT,chunkCount);i++){
  15. // 创建对应数量的线程 分配任务
  16. const worker = new Worker('./worker.js',{
  17. type:'module'
  18. })
  19. let start = i*threadChunkCount
  20. let end = (i+1)*threadChunkCount
  21. if(end > chunkCount) end = chunkCount
  22. worker.postMessage({
  23. file,
  24. CHUNK_SIZE,
  25. startChunkIndex: start,
  26. endChunkIndex:end ,// (i+1) * threadChunckCount
  27. });
  28. // 汇总结束
  29. worker.onmessage= e=>{
  30. for(let i = start ; i<end;i++){
  31. result[i] = e.data[i-start];
  32. }
  33. worker.terminate(); //线程完成
  34. finishedCount++; //完成一个线程数量+1
  35. if(finishedCount == Math.min(THREAD_COUNT,chunkCount)){
  36. // 函数结束
  37. resolve(result)
  38. }
  39. }
  40. }
  41. })
  42. }