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 07 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 NodeJs
nodeJS微信分享
Dec 20 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
让您的菜单不离网站
2006/10/03 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
Python调用C++程序的方法详解
2017/01/24 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
python实现文字版扫雷
2020/04/24 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
大学生自我评价怎样写好
2013/10/23 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
高一自我鉴定
2013/12/17 职场文书
请假条范文大全
2014/04/10 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
超市开店计划书
2014/09/15 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
MySQL库表名大小写的选择
2021/06/05 MySQL
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL