wh1246935943 2024-08-14 15:19 采纳率: 0%
浏览 14

大文件切片上传时,worker中怎么引入spark-md5?

下面是一个大文件切片计算md5时,再worker.js中调用createChunk,方法来拿到文件md5值,createChunk方法中调用了SparkMD5,但是
import SparkMD5 from './spark-md5.js';会导致worker报错,报错内容如下:

img

完整代码如下:

文件切片:
const CHUNK_SIZE = 1024 * 1024 * 5; // 5MB

const THREAD_COUNT = navigator.hardwareConcurrency || 4;

export async function cutFile(file) {

  return new Promise((resolve, reject) => {
    
    const chunkCount = Math.ceil(file.size / CHUNK_SIZE);

    const threadChunkCounts = Math.ceil(chunkCount / THREAD_COUNT);

    let finished = 0;

    const result = [];

    for (let i = 0; i < THREAD_COUNT; i++) {

      const worker = new Worker('./../js/worker.js', { type: 'module' });

      let end = (i + 1) * threadChunkCounts;

      const start = i * threadChunkCounts;

      if (end > chunkCount) {

        end = chunkCount;

      }

      worker.onerror = (err) => console.error('Worker error:', i, err);

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

      worker.onmessage = (e) => {

        for (let i = start; i < end; i++) {

          result[i] = e.data[i - start];

        }

        finished++;

        worker.terminate();

        if (finished === THREAD_COUNT) {

          resolve(result)

        }

      };
    }
  })
}
// worker.js

import { createChunk } from './createchunk.js';

console.log('Worker loaded successfully');

onmessage = async (e) => {

  const { start, end, file, CHUNK_SIZE } = e.data;

  console.log(`start: ${start}, end: ${end}`);

  const result = [];
  for (let i = start; i < end; i++) {
    result.push(createChunk(file, i, CHUNK_SIZE)) ;
  }
  const chunks = await Promise.all(result);

  postMessage(chunks);

}
// createchunk.js
import SparkMD5 from './spark-md5.js';

export function createChunk(file, index, chunkSize) {

  return new Promise((resolve) => {

    const start = index * chunkSize;

    const end = start + chunkSize;

    const spark = new SparkMD5.ArrayBuffer();

    const fileReader = new FileReader();

    const blob = file.slice(start, end);

    fileReader.onload = (e) => {

      spark.append(e.target.result)

      resolve({
        start,
        end,
        index,
        hash: spark.end(),
        blob
      })

    };

    fileReader.readAsArrayBuffer(blob);

  })

}

请问spark-md5.js应该怎么引入使用呢?

  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-08-14 15:20
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在实现大文件切片上传时,需要在 worker.js 中引入 SparkMD5 来计算文件的 MD5 值。但是直接在 worker.js 中使用 import SparkMD5 from './spark-md5.js'; 会导致报错。主要问题在于 Web Worker 环境中对模块的加载方式有所限制。

    解决方案

    为了在 Web Worker 中正确引入 SparkMD5,我们需要通过 importScripts 方法来加载脚本。importScripts 是 Web Worker 提供的一个全局方法,用于加载外部脚本。

    修改步骤

    1. 修改 worker.js 文件

      • 使用 importScripts 方法加载 spark-md5.js
      • 确保 spark-md5.js 文件路径正确。
    2. 调整 createChunk.js 文件

      • 确保 SparkMD5createChunk.js 中可用。

    修改后的代码

    worker.js

    importScripts('./spark-md5.js'); // 确保路径正确
    import { createChunk } from './createchunk.js';
    
    console.log('Worker loaded successfully');
    
    onmessage = async (e) => {
      const { start, end, file, CHUNK_SIZE } = e.data;
      console.log(`start: ${start}, end: ${end}`);
    
      const result = [];
      for (let i = start; i < end; i++) {
        result.push(createChunk(file, i, CHUNK_SIZE));
      }
      const chunks = await Promise.all(result);
    
      postMessage(chunks);
    }
    

    createchunk.js

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

    解释

    1. importScripts 方法

      • importScripts 是 Web Worker 提供的全局方法,用于加载外部脚本。它可以在 Worker 环境中加载并执行指定的脚本文件。
      • 通过 importScripts('./spark-md5.js'); 加载 spark-md5.js 文件,确保 SparkMD5 在 Worker 环境中可用。
    2. 路径问题

      • 确保 spark-md5.js 文件的路径正确,相对路径或绝对路径都可以,但要确保 Worker 能够正确找到并加载该文件。

    通过以上修改,可以在 Web Worker 中正确引入并使用 SparkMD5 来计算文件的 MD5 值,从而解决报错问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 创建了问题 8月14日

悬赏问题

  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?
  • ¥15 nasm x86 变量归零
  • ¥65 Tree 树形控件实现单选功能,可以使用element也可以手写一个,实现全选为全选状态
  • ¥60 寻抓云闪付tn组成网页付款链接
  • ¥16 寻字节跳动内部人员帮推简历
  • ¥20 如何通过sentry收集上传Android ndk的崩溃?