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实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
浅谈js中的闭包
2015/03/16 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python日期相关操作实例小结
2019/06/24 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
广告设计应届生求职信
2014/03/01 职场文书
2014年财政工作总结
2014/12/10 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
领导欢迎词范文
2015/01/26 职场文书
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python