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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
Nodejs进程管理模块forever详解
Jun 01 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
NodeJS使用formidable实现文件上传
Oct 27 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
Nodejs实现用户注册功能
Apr 14 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的autoload自动加载机制使用说明
2010/12/28 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
React简单介绍
2017/05/24 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
Python不规范的日期字符串处理类
2014/06/10 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
Python读写压缩文件的方法
2020/07/30 Python
python调用百度API实现人脸识别
2020/11/17 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
物流司机岗位职责
2013/12/28 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
工程业务员岗位职责
2013/12/31 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
高二历史教学反思
2014/01/25 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
真诚的求职信
2014/07/04 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
学校运动会加油词
2015/07/18 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书