nodejs实现范围请求的实现代码


Posted in NodeJs onOctober 12, 2018

使服务器支持范围请求,允许客户端只请求文档的一部分。其流程是:

  1. 客户端向服务端发起请求
  2. 服务端响应,附上Accept-Ranges头(值表示表示范围的单位,通常是“bytes”),告诉客户端其接受范围请求
  3. 客户端发送新的请求,附上Ranges头,告诉服务端请求的是一个范围
  4. 服务端收到范围请求,分情况响应:
    1. 范围有效,服务端返回206 Partial Content,发送指定范围内内容,并在Content-Range头中指定该范围
    2. 范围无效,服务端返回416 Requested Range Not Satisfiable,并在Content-Range中指明可接受范围

请求中的Ranges头格式为(这里不考虑多范围请求了):

Ranges: bytes=[start]-[end]

其中 start 和 end 并不是必须同时具有:

  • 如果 end 省略,服务器应返回从 start 位置开始之后的所有字节
  • 如果 start 省略,end 值指的就是服务器该返回最后多少个字节
  • 如果均未省略,则服务器返回 start 和 end 之间的字节

响应中的Content-Range头有两种格式:

当范围有效返回 206 时:

Content-Range: bytes (start)-(end)/(total)

当范围无效返回 416 时:

Content-Range: bytes */(total)
//代码实现
res.setHeader('Content-Range', `bytes */${totalSize}`);

添加函数处理范围请求:

【注意】这里吧不合理的范围请求直接设置为返回全部,如果想设置范围错误就直接不返回可以设置http状态码为416

/**
 * 范围请求
 * 不在合理的范围内就直接返回所有
 * 在合理规范的范围内就按照返回对应的部分
 * @param {*} totleSize 总的范围
 * @param {*} req 
 * @param {*} res 
 */
module.exports = (totleSize, req, res) => {
  const range = req.headers['range'];
  if (!range) {
    return {code: 200};
  }
 
  const sizes = range.match(/bytes=(\d*)-(\d*)/);
  const end = sizes[2] || totleSize - 1;
  const start = sizes[1] || totleSize - end;
  //不规范的范围,是要直接一起返回,所以设置状态码200
  if(start > end || start < 0 || end > totleSize) {
    return {code: 200};
  }
  res.setHeader('Accept-Ranges', 'bytes');
  res.setHeader('Content_Range', `bytes ${start}-${end}/${totleSize}`);
  res.setHeader('Content_Length', end-start);
  return {
    code: 206,
    start: parseInt(start),
    end: parseInt(end)
  };
};

范围读取:

let rs;
const { code, start, end } = range(stats.size, req, res);
if (code === 200) {
  res.statusCode = 200;
  rs = fs.createReadStream(filePath);
} else {
  res.statusCode = 206;//表示是部分内容
  //创建一个流读取文件, {start, end}表示文件读取的起始点和终点
  rs = fs.createReadStream(filePath, { start, end });
}
 
//有这个pipe就不需要再去调用end了,这样直接调用end会导致res接受不到东西,因为pipe是异步的
rs.pipe(res);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 NodeJs
Nodejs实现用户注册功能
Apr 14 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 #NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 #NodeJs
nodejs aes 加解密实例
Oct 10 #NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 #NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 #NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 #NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 #NodeJs
You might like
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
用 php 编写的日历
2006/10/09 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
优秀员工演讲稿
2014/05/19 职场文书
战友聚会策划方案
2014/06/13 职场文书
关爱残疾人标语
2014/06/25 职场文书
促销活动总结模板
2014/07/01 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
党员思想汇报材料
2014/12/19 职场文书
优秀校长事迹材料
2014/12/24 职场文书
2015感人爱情寄语
2015/02/26 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server