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实现黑名单中间件设计
Jun 17 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
PHP合并静态文件详解
2014/11/14 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
js返回上一页并刷新代码整理
2012/12/21 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
python 布尔操作实现代码
2013/03/23 Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python装饰器使用示例及实际应用例子
2015/03/06 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
小学生开学感言
2014/02/28 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
机关作风建设工作总结
2014/10/23 职场文书
初中生毕业评语
2014/12/29 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript