当前位置:首页 > JavaScript

js实现分包传输大文件

2026-03-01 23:21:22JavaScript

实现大文件分包传输的方法

在JavaScript中实现大文件分包传输的核心思路是将文件分割为多个小块(chunks),分别上传或传输,最后在服务端合并。以下为具体实现方法:

前端文件分块处理

使用File对象的slice方法分割文件,结合Blob类型处理二进制数据:

function splitFile(file, chunkSize = 5 * 1024 * 1024) {
  const chunks = [];
  let offset = 0;

  while (offset < file.size) {
    const chunk = file.slice(offset, offset + chunkSize);
    chunks.push(chunk);
    offset += chunkSize;
  }

  return chunks;
}

分块上传逻辑

通过FormDatafetch API逐块上传,建议添加重试机制:

async function uploadChunks(chunks, uploadUrl) {
  const uploadResults = [];

  for (let i = 0; i < chunks.length; i++) {
    const formData = new FormData();
    formData.append('chunk', chunks[i]);
    formData.append('chunkIndex', i);
    formData.append('totalChunks', chunks.length);

    const response = await fetch(uploadUrl, {
      method: 'POST',
      body: formData
    });

    uploadResults.push(await response.json());
  }

  return uploadResults;
}

服务端合并处理

服务端需要实现两个接口:

  1. 接收分块并临时存储
  2. 合并所有分块为完整文件

Node.js示例(使用Express):

js实现分包传输大文件

const fs = require('fs');
const path = require('path');

// 接收分块
app.post('/upload-chunk', (req, res) => {
  const { chunk, chunkIndex, totalChunks } = req.body;
  const tempDir = path.join(__dirname, 'temp');

  if (!fs.existsSync(tempDir)) {
    fs.mkdirSync(tempDir);
  }

  const chunkPath = path.join(tempDir, `chunk-${chunkIndex}`);
  fs.writeFileSync(chunkPath, chunk);

  res.json({ success: true, chunkIndex });
});

// 合并分块
app.post('/merge-chunks', (req, res) => {
  const { fileName, totalChunks } = req.body;
  const tempDir = path.join(__dirname, 'temp');
  const writeStream = fs.createWriteStream(fileName);

  for (let i = 0; i < totalChunks; i++) {
    const chunkPath = path.join(tempDir, `chunk-${i}`);
    const chunkData = fs.readFileSync(chunkPath);
    writeStream.write(chunkData);
    fs.unlinkSync(chunkPath);
  }

  writeStream.end();
  res.json({ success: true });
});

优化建议

  1. 断点续传:记录已上传的分块索引,支持中断后继续上传
  2. 并行上传:使用Promise.all实现多个分块同时上传
  3. 进度监控:通过XMLHttpRequestprogress事件或fetchReadableStream跟踪进度
  4. 文件校验:在合并后计算文件的MD5或SHA哈希值进行完整性验证

完整工作流程

  1. 前端计算文件哈希作为唯一标识
  2. 查询服务端是否已存在相同文件
  3. 若需上传,先获取已上传的分块列表
  4. 只上传缺失的分块数据
  5. 所有分块上传完成后触发合并请求

这种方式适合大文件传输,能有效降低网络中断风险,提高传输稳定性。

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

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js树实现

js树实现

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

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…