当前位置:首页 > JavaScript

js实现文件上传限速

2026-01-31 02:37:41JavaScript

实现文件上传限速的方法

在JavaScript中实现文件上传限速可以通过控制上传数据的速率来实现。以下是几种常见的方法:

js实现文件上传限速

使用XMLHttpRequest和定时器

通过XMLHttpRequest对象发送文件数据,结合定时器控制上传速率。

js实现文件上传限速

function uploadWithThrottle(file, url, maxSpeed) {
  const chunkSize = maxSpeed * 1024; // 转换为KB
  const totalChunks = Math.ceil(file.size / chunkSize);
  let currentChunk = 0;

  function uploadNextChunk() {
    const start = currentChunk * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');
    xhr.setRequestHeader('X-Chunk-Number', currentChunk);
    xhr.setRequestHeader('X-Total-Chunks', totalChunks);

    xhr.onload = function() {
      if (currentChunk < totalChunks - 1) {
        currentChunk++;
        setTimeout(uploadNextChunk, 1000); // 延迟1秒上传下一块
      }
    };

    xhr.send(chunk);
  }

  uploadNextChunk();
}

使用Fetch API和AbortController

利用Fetch API和AbortController实现更精细的速率控制。

async function throttledUpload(file, url, maxSpeed) {
  const chunkSize = maxSpeed * 1024;
  const totalChunks = Math.ceil(file.size / chunkSize);
  const controller = new AbortController();

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

    try {
      await fetch(url, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/octet-stream',
          'X-Chunk-Number': i,
          'X-Total-Chunks': totalChunks
        },
        body: chunk,
        signal: controller.signal
      });

      await new Promise(resolve => setTimeout(resolve, 1000));
    } catch (error) {
      if (error.name === 'AbortError') {
        console.log('Upload aborted');
      } else {
        console.error('Upload error:', error);
      }
      break;
    }
  }
}

使用WebSocket实现实时控制

WebSocket可以提供更实时的上传速率控制。

function wsUpload(file, wsUrl, maxSpeed) {
  const ws = new WebSocket(wsUrl);
  const chunkSize = maxSpeed * 1024;
  const totalChunks = Math.ceil(file.size / chunkSize);
  let currentChunk = 0;

  ws.onopen = function() {
    sendNextChunk();
  };

  function sendNextChunk() {
    if (currentChunk >= totalChunks || ws.readyState !== WebSocket.OPEN) return;

    const start = currentChunk * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const reader = new FileReader();
    reader.onload = function(e) {
      ws.send(e.target.result);
      currentChunk++;

      if (currentChunk < totalChunks) {
        setTimeout(sendNextChunk, 1000);
      }
    };
    reader.readAsArrayBuffer(chunk);
  }
}

注意事项

  • 速率单位应统一为KB/s或MB/s
  • 服务器端需要支持分块上传
  • 需要考虑网络延迟和重试机制
  • 大文件上传需要实现断点续传功能

以上方法可以根据实际需求进行调整,结合进度条显示等用户体验优化措施。

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

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…