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 24 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
php字符串操作针对负值的判断分析
2016/07/28 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python中os.path用法分析
2015/01/15 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
分析python请求数据
2018/08/19 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
python3实现高效的端口扫描
2019/08/31 Python
python随机模块random使用方法详解
2020/02/14 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
校本教研工作制度
2014/01/22 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
应聘英语教师求职信
2014/04/24 职场文书
给校长的建议书300字
2014/05/16 职场文书
篮球比赛策划方案
2014/06/05 职场文书
入党介绍人意见范文
2015/06/01 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
Python爬虫基础初探selenium
2021/05/31 Python