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进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
html读出文本文件内容
2007/01/22 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python设置值及NaN值处理方法
2018/07/03 Python
Python函数中不定长参数的写法
2019/02/13 Python
学Python 3的理由和必要性
2019/11/19 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
室内设计专业个人的自我评价
2013/10/19 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
信仰心得体会
2014/09/05 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
商务英语求职信范文
2015/03/19 职场文书
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android