当前位置:首页 > JavaScript

js实现文件上传限速

2026-01-31 02:37:41JavaScript

实现文件上传限速的方法

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

使用XMLHttpRequest和定时器

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

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可以提供更实时的上传速率控制。

js实现文件上传限速

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 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

vue实现文件上传

vue实现文件上传

文件上传的基本实现 在Vue中实现文件上传通常需要结合HTML的<input type="file">元素和JavaScript的File对象处理。创建一个基本的文件上传组件: <…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

jquery 文件上传

jquery 文件上传

jQuery 文件上传实现方法 使用 jQuery 实现文件上传可以通过多种方式,以下是几种常见的实现方法: 使用原生 HTML5 和 jQuery AJAX 创建一个表单并处理文件上传:…

js 实现超链接

js 实现超链接

使用 HTML 的 <a> 标签 在 JavaScript 中动态创建超链接可以通过操作 DOM 实现。通过 document.createElement 创建一个 <a> 元…