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开发微信公众号后台服务实例
Sep 03 NodeJs
详谈nodejs异步编程
Dec 04 NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs中解决异步嵌套循环和循环嵌套异步的问题
Jul 12 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 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查看一个变量的占用内存的实例代码
2020/03/29 PHP
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Python端口扫描简单程序
2016/11/10 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Django用户身份验证完成示例代码
2020/04/03 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
数控技术应届生求职信
2013/11/13 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
开除通知书范本
2015/04/25 职场文书
刑事辩护词范文
2015/05/21 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
党小组考察意见
2015/06/02 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫