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 26 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
nodejs开发微博实例
Mar 25 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 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获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
用javascript操作xml
2006/11/04 Javascript
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
Python中文件遍历的两种方法
2014/06/16 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
pyqt5实现登录界面的模板
2020/05/30 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
保安员岗位职责
2013/11/17 职场文书
租赁协议书范本
2014/04/22 职场文书
企业年检委托书范本
2014/10/14 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python