当前位置:首页 > JavaScript

js实现文件上传限速

2026-04-04 18:32:55JavaScript

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

使用XMLHttpRequest实现限速

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

js实现文件上传限速

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来控制上传速率。

js实现文件上传限速

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

实现自定义限速逻辑

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

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

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…