js实现文件上传限速
在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();
使用第三方库实现限速
一些第三方库如axios或superagent提供了内置的限速功能。
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。






