Http Range Request允许服务器仅将 HTTP 消息的一部分发送回客户端。范围请求对于支持随机访问的媒体播放器、知道它们只需要大文件的一部分的数据工具以及允许用户暂停和恢复下载的下载管理器等客户端非常有用。
下面是一个实现例子:
import { createServer } from 'node:http';
import { createReadStream } from 'node:fs';
import { stat } from 'node:fs/promises';
const server = createServer(async (req, res) => {
const filePath = 'test.mp4';
const range = req.headers.range;
const fileSize = (await stat(filePath)).size;
res.statusCode = 200;
res.setHeader('Content-Type', 'video/mp4');
if (range) {
const ranges = range ? range.replace('bytes=', '').split('-') : ['0', `${fileSize - 1}`];
const start = Number.parseInt(ranges[0]) || 0;
const end = Number.parseInt(ranges[1]) || fileSize - 1;
if (start >= fileSize || end >= fileSize) {
res.setHeader('Content-Range', `bytes */${fileSize}`);
res.statusCode = 416;
res.end();
return;
}
res.setHeader('Content-Range', `bytes ${start}-${end}/${fileSize}`);
res.setHeader('Content-Length', `${end - start + 1}`);
res.setHeader('Accept-Ranges', 'bytes');
res.statusCode = 206;
createReadStream(filePath, { start, end, autoClose: true }).pipe(res);
} else {
res.setHeader('Content-Length', `${fileSize}`);
createReadStream(filePath).pipe(res);
}
});
server.listen(3000, '127.0.0.1', () => {
console.log('Listening on 127.0.0.1:3000');
});
参考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests