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开发微博实例
Mar 25 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs简单抓包工具使用详解
Aug 23 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
用header 发送cookie的php代码
2007/03/16 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python命名空间详解
2014/08/18 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
python爬虫之自制英汉字典
2019/06/24 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
药学专业大专生的自我评价
2013/12/12 职场文书
简历的自我评价范文
2014/02/04 职场文书
大学生毕业求职信
2014/06/12 职场文书
效能风暴心得体会
2014/09/04 职场文书
外贸英文求职信范文
2015/03/19 职场文书
详解JS数组方法
2021/11/20 Javascript
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android