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服务器(6):作出响应
Dec 18 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
php生成随机颜色方法汇总
2014/12/03 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
python实现杨辉三角思路
2017/07/14 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
python后端接收前端回传的文件方法
2019/01/02 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
文明家庭先进事迹材
2014/01/27 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
2016十一国庆节感言
2015/12/09 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server