当前位置:首页 > 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实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js实现文件夹

js实现文件夹

使用JavaScript创建文件夹 在浏览器端的JavaScript中无法直接操作文件系统创建文件夹,这是出于安全考虑。但在Node.js环境中可以通过文件系统模块(fs)实现。 Node.js中使…