当前位置:首页 > JavaScript

js实现分段上传

2026-04-07 13:11:11JavaScript

分段上传的实现方法

在JavaScript中实现分段上传通常涉及将大文件分割成小块,逐块上传并在服务器端合并。以下是常见的实现方式:

使用XMLHttpRequest或Fetch API

通过前端JavaScript将文件切片,使用AJAX技术逐块上传:

function uploadFileInChunks(file, chunkSize = 1024 * 1024) {
  const totalChunks = Math.ceil(file.size / chunkSize);
  let chunkNumber = 0;

  function uploadChunk() {
    const start = chunkNumber * 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('chunkNumber', chunkNumber);
    formData.append('totalChunks', totalChunks);
    formData.append('fileId', file.name + '-' + file.size);

    fetch('/upload', {
      method: 'POST',
      body: formData
    })
    .then(response => {
      chunkNumber++;
      if (chunkNumber < totalChunks) {
        uploadChunk();
      } else {
        console.log('Upload complete');
      }
    });
  }

  uploadChunk();
}

使用Resumable.js等库

Resumable.js是专门处理大文件分段上传的JavaScript库:

js实现分段上传

const r = new Resumable({
  target: '/upload',
  chunkSize: 1*1024*1024,
  simultaneousUploads: 3,
  testChunks: true
});

r.assignBrowse(document.getElementById('browseButton'));
r.assignDrop(document.getElementById('dropTarget'));

r.on('fileAdded', function(file) {
  r.upload();
});

r.on('fileSuccess', function(file) {
  console.log(file.fileName + ' uploaded');
});

服务器端处理

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

  • 接收分块并临时存储
  • 验证分块完整性
  • 合并所有分块为完整文件
  • 处理上传中断后的恢复

Node.js示例(Express框架):

js实现分段上传

app.post('/upload', (req, res) => {
  const chunk = req.files.chunk;
  const chunkNumber = req.body.chunkNumber;
  const totalChunks = req.body.totalChunks;
  const fileId = req.body.fileId;

  const tempDir = `./temp/${fileId}`;
  if (!fs.existsSync(tempDir)) fs.mkdirSync(tempDir);

  chunk.mv(`${tempDir}/${chunkNumber}`, (err) => {
    if (err) return res.status(500).send(err);

    if (parseInt(chunkNumber) === parseInt(totalChunks) - 1) {
      mergeChunks(fileId, totalChunks);
    }

    res.status(200).send('Chunk uploaded');
  });
});

function mergeChunks(fileId, totalChunks) {
  const tempDir = `./temp/${fileId}`;
  const writeStream = fs.createWriteStream(`./uploads/${fileId}`);

  for (let i = 0; i < totalChunks; i++) {
    const chunk = fs.readFileSync(`${tempDir}/${i}`);
    writeStream.write(chunk);
  }

  writeStream.end();
  fs.rmdirSync(tempDir, { recursive: true });
}

进度监控

实现上传进度监控:

const xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', (event) => {
  if (event.lengthComputable) {
    const percentComplete = (event.loaded / event.total) * 100;
    console.log(percentComplete + '% uploaded');
  }
}, false);

断点续传

实现断点续传需要:

  • 前端记录已上传的分块
  • 服务器端提供已接收分块信息接口
  • 上传前检查哪些分块需要上传
function checkUploadStatus(fileId, totalChunks) {
  return fetch(`/upload-status?fileId=${fileId}`)
    .then(res => res.json())
    .then(data => {
      const uploadedChunks = data.chunks || [];
      return Array.from({length: totalChunks}, (_, i) => i)
        .filter(i => !uploadedChunks.includes(i));
    });
}

注意事项

  • 分块大小需要合理设置,通常1MB-5MB
  • 需要处理网络错误和重试机制
  • 服务器端需要定期清理未完成的临时文件
  • 考虑文件唯一性校验(如MD5)
  • 跨域上传需要配置CORS

以上方法可根据具体需求组合使用,实现稳定可靠的分段上传功能。

标签: 上传js
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

链表实现js

链表实现js

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

vue 怎么实现上传

vue 怎么实现上传

Vue 实现文件上传的方法 使用原生 HTML5 文件上传 通过 <input type="file"> 元素结合 Vue 的数据绑定实现基础文件上传功能。 <template&g…