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读取memcache示例分享
Jan 02 NodeJs
使用forever管理nodejs应用教程
Jun 03 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 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 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
PHP类的封装与继承详解
2015/09/29 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
js prototype截取字符串函数
2010/04/01 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
简单了解python的一些位运算技巧
2019/07/13 Python
python实现堆排序的实例讲解
2020/02/21 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
社团文化节策划书
2014/02/01 职场文书
服装店营销方案
2014/03/10 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
三八节标语
2014/06/27 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
义卖募捐活动总结
2015/05/09 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
致运动员的广播稿
2015/08/19 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS