Node.JS段点续传:Nginx配置文件分段下载功能的实现方法


Posted in Javascript onMarch 12, 2018

Html5 提供了一个新的 Range 标签来实现文件的分段下载。在Node.JS中可以配置这个标签来实现文件的分段下载。

Header标签

请求 Request Header: 下载 3744 以后的文件内容

range: bytes=3744-

返回 Response Header: 文件总长 15522643 个字节

accept-ranges': 'bytes'
content-range': 'bytes */15522643'

Nginx配置

首先要配置Nginx支持range标签返回,很简单添加 add_header Accept-Ranges bytes; 这一行即可

server {
 listen 80;
 server_name adksdf.com;
 location ~ ^/(img/|js/|css/|upload/|font/|fonts/|res/|icon) {
  add_header Access-Control-Allow-Origin *;
  add_header Accept-Ranges bytes;
  root /var/www/...;
  access_log off;
  expires max;
 }
 ...
}

启用以后,如果node.js端发送了含有 range header的请求信息,那么nginx会返回含有range相关的信息:

这是一段完整的Response Header,注意这里的 content-length 不是文件的总长度,而是当前 range 的长度。

{ server: 'nginx',
 date: 'Wed, 24 Jan 2018 02:43:20 GMT',
 'content-type': 'application/zip',
 'content-length': '12420187',
 'last-modified': 'Tue, 16 Jan 2018 12:09:47 GMT',
 connection: 'close',
 etag: '"5a5deb8b-ecdb53"',
 expires: 'Thu, 31 Dec 2037 23:55:55 GMT',
 'cache-control': 'max-age=315360000',
 'access-control-allow-origin': '*',
 'accept-ranges': 'bytes',
 'content-range': 'bytes 3102456-15522642/15522643' }

可以根据这个header中的content-range来获取文件的总大小。

Node.JS实现

这段示例先检测本地下了一半的文件,然后以 'r+' 读写模式创建文件流,并将response流写入文件。

这里将表态文件添加 range 的支持。

var reqOptions = { url: packageUrl, headers: {} }
var filepath  = '/path/to/your/part/file'
var fileOptions = {}
fs.stat(filepath, function(err, states) {
 if (states) {
  //Range: bytes=3744-
  reqOptions.headers['range'] = 'bytes=' + states.size + '-'
  fileOptions = { start: states.size, flags: 'r+' }
 }
 //创建 http 对象方法
 var reqUrl = reqOptions.url
 var urlObj = url.parse(reqUrl)
 var options = {
   hostname : urlObj.hostname
  , port   : urlObj.port
  , path   : urlObj.pathname
  , headers  : reqOptions.headers || {}
 }
 var req = http.request(options, function(res) {
  var receives  = []
  var err     = null
  var statusCode = res.statusCode
  var headers   = res.headers
  var ws = fs.createWriteStream(filepath, fileOptions)
  ws.on('error', function(e) {
   console.log('ws error', e)
  })
  res.on('data', function(chrunk) {
   ws.write(chrunk)
  })
  res.on('error', function(err) {
   ws.end()
  })
  res.on('end', function() {
   ws.end()
  })
 })
 req.on('error', function(e) {
  cb && cb(e, null, {})
 })
 req.end()
 ...
})

返回Header

在请求nginx可能会返回其他status code,比如说 206或416,含意如下:

206 Partial Content

返回的是部分文件内容

416 Requested Range Not Satisfiable

请求的range超过文件尺寸

总结

以上所述是小编给大家介绍的Node.JS段点续传:Nginx配置文件分段下载功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
Mar 01 Javascript
JS脚本defer的作用示例介绍
Jan 02 Javascript
javascript获取文档坐标和视口坐标
May 26 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
Web开发必知Javascript技巧大全
Feb 23 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
Jun 12 Javascript
javascript中Date对象应用之简易日历实现
Jul 12 Javascript
JavaScript获取服务器端时间的方法
Nov 29 Javascript
Angular2关于@angular/cli默认端口号配置的问题
Jul 15 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
Feb 08 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
javascript变量提升和闭包理解
Mar 12 #Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
Mar 12 #Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 #Javascript
JS中touchstart事件与click事件冲突的解决方法
Mar 12 #Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
Mar 12 #Javascript
Javascript中prototype与__proto__的关系详解
Mar 11 #Javascript
js中document.write和document.writeln的区别
Mar 11 #Javascript
You might like
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
python中format()函数的简单使用教程
2018/03/14 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python3 集合set入门基础
2020/02/10 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
个人求职信范文分享
2014/01/06 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
初中英语演讲稿
2014/04/29 职场文书
文明生主要事迹
2014/05/25 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书