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使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
初探nodeJS
Jan 24 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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下检测字符串是否是utf8编码的代码
2008/06/28 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
Python中Class类用法实例分析
2015/11/12 Python
Python numpy 常用函数总结
2017/12/07 Python
详解Python循环作用域与闭包
2019/03/21 Python
Django发送邮件功能实例详解
2019/09/02 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
详解Django配置优化方法
2019/11/18 Python
django model object序列化实例
2020/03/13 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
英国钻石公司:British Diamond Company
2020/02/16 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
优秀少先队工作者事迹材料
2014/05/13 职场文书
公司委托书格式范文
2014/10/09 职场文书
全国助残日活动总结
2015/05/11 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
Docker安装MySql8并远程访问的实现
2022/07/07 Servers