当前位置:首页 > JavaScript

js实现分包传输大文件

2026-01-31 08:11:03JavaScript

使用分块上传技术

在JavaScript中,可以通过Blob.slice()方法将大文件分割成多个小块,然后通过FormData逐个上传。这种方法适合处理大文件上传,避免单次请求超时或内存不足。

const uploadFile = async (file, chunkSize = 5 * 1024 * 1024) => {
  const totalChunks = Math.ceil(file.size / chunkSize);
  for (let i = 0; i < totalChunks; i++) {
    const start = i * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('chunkIndex', i);
    formData.append('totalChunks', totalChunks);
    formData.append('fileName', file.name);

    await fetch('/upload', {
      method: 'POST',
      body: formData
    });
  }
};

利用Web Workers处理计算密集型任务

如果文件分块涉及复杂计算(如哈希校验),可以使用Web Workers在后台线程处理,避免阻塞主线程。

// worker.js
self.onmessage = (e) => {
  const { chunk, index } = e.data;
  // 计算哈希等操作
  postMessage({ index, hash: computedHash });
};

// 主线程
const worker = new Worker('worker.js');
worker.postMessage({ chunk: fileChunk, index: chunkIndex });

断点续传实现

通过记录已上传的块索引,可以在网络中断后恢复上传。需要服务端支持记录上传状态。

const resumeUpload = async (file, uploadedChunks) => {
  const chunkSize = 5 * 1024 * 1024;
  const totalChunks = Math.ceil(file.size / chunkSize);

  for (let i = 0; i < totalChunks; i++) {
    if (uploadedChunks.includes(i)) continue;
    // 上传逻辑...
  }
};

使用Streams API处理超大文件

现代浏览器支持Streams API,可以逐块读取文件内容,显著降低内存占用。

const streamUpload = async (file) => {
  const stream = file.stream();
  const reader = stream.getReader();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    // 处理每个value块
    await processChunk(value);
  }
};

服务端配合注意事项

服务端需要实现以下功能:

  • 接收分块并临时存储
  • 校验每个块的完整性
  • 合并所有分块为完整文件
  • 提供上传进度查询接口

典型Node.js合并示例:

const mergeChunks = (fileName, totalChunks) => {
  const writeStream = fs.createWriteStream(fileName);
  for (let i = 0; i < totalChunks; i++) {
    const chunk = fs.readFileSync(`${fileName}.part${i}`);
    writeStream.write(chunk);
  }
  writeStream.end();
};

前端进度反馈

通过事件或Promise提供上传进度反馈:

js实现分包传输大文件

const uploadWithProgress = (file, onProgress) => {
  let uploaded = 0;
  // 分块上传逻辑...
  onProgress(uploaded / file.size * 100);
};

标签: 大文件js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…