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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 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 采集书并合成txt格式的实现代码
2009/03/01 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
js中的面向对象入门
2017/03/06 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
python分析网页上所有超链接的方法
2015/05/08 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
flask-restful使用总结
2018/12/04 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
骨干教师培训制度
2014/01/13 职场文书
质检部经理岗位职责
2014/02/19 职场文书
安全生产宣传标语
2014/06/06 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
嘉宾邀请函
2015/01/31 职场文书
幼儿园见习总结
2015/06/23 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python