当前位置:首页 > JavaScript

js实现文件上传限速

2026-04-04 18:32:55JavaScript

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

使用XMLHttpRequest实现限速

XMLHttpRequest对象可以通过监听progress事件来控制上传速率。

const xhr = new XMLHttpRequest();
xhr.open('POST', '/upload', true);

xhr.upload.onprogress = function(event) {
  if (event.lengthComputable) {
    const currentSpeed = event.loaded / (Date.now() - startTime);
    if (currentSpeed > maxSpeed) {
      xhr.abort();
      // 重新计算并继续上传
    }
  }
};

xhr.send(file);

使用Fetch API实现限速

Fetch API可以通过ReadableStream来控制上传速率。

const fileStream = file.stream();
const reader = fileStream.getReader();

const uploadChunk = async () => {
  const { value, done } = await reader.read();
  if (done) return;

  // 控制上传速率
  await new Promise(resolve => setTimeout(resolve, delay));
  fetch('/upload', {
    method: 'POST',
    body: value,
  }).then(uploadChunk);
};

uploadChunk();

使用第三方库实现限速

一些第三方库如axiossuperagent提供了内置的限速功能。

const axios = require('axios');
const rateLimit = require('axios-rate-limit');

const http = rateLimit(axios.create(), {
  maxRequests: 1,
  perMilliseconds: 1000,
});

http.post('/upload', file);

实现自定义限速逻辑

可以通过控制每次上传的数据块大小和间隔时间来实现限速。

js实现文件上传限速

const chunkSize = 1024 * 10; // 10KB
const delay = 1000; // 1秒

const uploadFile = async (file) => {
  const totalChunks = Math.ceil(file.size / chunkSize);
  for (let i = 0; i < totalChunks; i++) {
    const chunk = file.slice(i * chunkSize, (i + 1) * chunkSize);
    await new Promise(resolve => setTimeout(resolve, delay));
    await fetch('/upload', {
      method: 'POST',
      body: chunk,
    });
  }
};

uploadFile(file);

注意事项

  • 限速逻辑可能会增加上传时间,需根据实际需求调整速率。
  • 确保服务器端支持分块上传,否则限速逻辑可能无法正常工作。
  • 测试不同浏览器的兼容性,某些旧版本浏览器可能不支持某些API。

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

相关文章

js实现计算器

js实现计算器

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

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

h5实现文件上传

h5实现文件上传

实现文件上传的基本方法 使用HTML5的<input type="file">元素是最简单的文件上传方式。通过设置multiple属性可以实现多文件选择。 <input type=…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…