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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs基础知识
Feb 03 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
献给php初学者(入门学习经验谈)
2010/10/12 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
Python的math模块中的常用数学函数整理
2016/02/04 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
自荐信要包含哪些内容
2013/11/06 职场文书
医学专业毕业生推荐信
2013/11/14 职场文书
机修工岗位职责
2013/11/24 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
国防教育标语
2014/10/08 职场文书
小学运动会加油稿
2015/07/22 职场文书