当前位置:首页 > 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 });

断点续传实现

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

js实现分包传输大文件

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);
  }
};

服务端配合注意事项

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

js实现分包传输大文件

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

典型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提供上传进度反馈:

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

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

相关文章

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现交换

js实现交换

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

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…

js 实现日历

js 实现日历

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

js实现上传图片预览

js实现上传图片预览

使用FileReader实现图片预览 通过FileReader对象读取用户选择的图片文件,并将其显示在页面上。这种方法适用于现代浏览器。 // HTML部分 <input type="file…

js实现递归

js实现递归

递归的基本概念 递归是一种通过函数调用自身来解决问题的方法。在JavaScript中,递归通常用于处理具有重复子问题或分治结构的数据,例如树形结构、阶乘计算等。 递归的实现要点 基线条件(Base…