当用户从静态文件服务器上获取诸如歌曲这样的流媒体文件时,若是网络链接断开,重连后未作处理,就须要从新下载这个文件。因此为了不这种状况,咱们的服务器须要一种断点续传的功能。而http 1.1中正好规定了一种
Range
机制,咱们能够经过这种机制来进行分片传输。javascript
当一个服务器支持Range
时,客户端能够将须要发送的内容分红不少份发送给服务端,服务端能够每次接收部份内容。有了这样的能力,遇到断网的状况,咱们能够在客户端记录下已经传送的文件范围,网络恢复后再将剩余部分发送给服务端,这样就实现了断点续传。java
Range
的在http 1.1中的具体定义能够参考文档:node
具体流程以下:浏览器
浏览器请求内容。服务器
服务器告诉浏览器,该内容可使用 Accept-Ranges 消息头进行分部分请求。网络
response.setHeader('Accept-Ranges', 'bytes');
复制代码
浏览器从新发送请求,用 Range 消息头告诉服务器须要的内容范围。学习
发送的Range格式:字节数(bytes)= (开始)-(结束)ui
这是浏览器告知服务器所需分部份内容范围的消息头. 注意开始和结束位置是都包括在内的,并且是从0开始的. 这个消息头也能够不发送两个位置,其含义以下:spa
而服务器会分以下两种状况响应浏览器的请求:code
getStream(req, res, filepath, statObj) {
let start = 0;
let end = statObj.size - 1;
let range = req.headers['range'];
if (range) {
res.setHeader('Accept-Range', 'bytes');
res.statusCode = 206;
let result = range.match(/bytes=(\d*)-(\d*)/);
if (result) {
start = isNaN(result[1]) ? start : parseInt(result[1]);
end = isNaN(result[2]) ? end : parseInt(result[2]) - 1;
}
}
return fs.createReadStream(filepath, {
start, end
});
}
复制代码
在搭建node静态服务器过程当中学习利用Http1.1的Range
来实现断点续传功能