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 相关文章推荐
新浪中用来显示flash的函数
Apr 02 Javascript
JavaScript学习历程和心得小结
Aug 16 Javascript
JavaScript中this的使用详解
Nov 08 Javascript
Bootstrap Paginator分页插件使用方法详解
May 30 Javascript
jQuery实现微信长按识别二维码功能
Aug 26 Javascript
浅谈jquery高级方法描述与应用
Oct 04 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
Apr 16 Javascript
解决layui调用自定义方法提示未定义的问题
Sep 14 Javascript
vue下的@change事件的实现
Oct 25 Javascript
js里面的变量范围分享
Jul 18 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中调用JAVA
2006/10/09 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
Js 中debug方式
2010/02/07 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
2014/01/24 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
js实现分页功能
2017/05/24 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
使用python爬取B站千万级数据
2018/06/08 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python实现电脑自动关机
2018/06/20 Python
python实现一组典型数据格式转换
2018/12/15 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
EJB面试题
2015/07/28 面试题
通信生自我鉴定
2014/01/18 职场文书
硕士生工作推荐信
2014/03/07 职场文书
《四季》教学反思
2014/04/08 职场文书
审计专业自荐信范文
2014/04/21 职场文书
初中英语课后反思
2014/04/25 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
教师见习报告范文
2014/11/03 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书