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实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
node快速搭建后台的实现步骤
Feb 18 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
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
javascript网页关键字高亮代码
2008/07/30 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
python查看zip包中文件及大小的方法
2015/07/09 Python
Python数据结构之翻转链表
2017/02/25 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python 阶乘累加和的实例
2019/02/01 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
Python类成员继承重写的实现
2020/09/16 Python
悬挂训练绳:TRX
2017/12/14 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
环境建设实施方案
2014/03/14 职场文书
纠风工作实施方案
2014/03/15 职场文书
大学生工作自荐书
2014/06/16 职场文书
2014和解协议书范文
2014/09/15 职场文书
2014年仓库工作总结
2014/11/20 职场文书
博士给导师的自荐信
2015/03/06 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers