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 相关文章推荐
js 覆盖和重载 函数
Sep 25 Javascript
js判断文本框剩余可输入字数的方法
Feb 04 Javascript
JSON 对象未定义错误的解决方法
Sep 29 Javascript
仿iframe效果Aajx文件上传实例
Nov 18 Javascript
深入对Vue.js $watch方法的理解
Mar 20 Javascript
layui选项卡效果实现代码
May 19 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
js指定日期增加指定月份的实现方法
Dec 19 Javascript
详解JS取出两个数组中的不同或相同元素
Mar 20 Javascript
微信小程序 冒泡事件原理解析
Sep 27 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
JavaScript中如何调用Java方法
Sep 16 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 minixml详解
2008/07/19 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
js调用图片隐藏&显示实现代码
2013/09/13 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
Express系列之multer上传的使用
2017/10/27 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
开源Web应用框架Django图文教程
2017/03/09 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
认错检讨书
2014/10/02 职场文书
员工2014年度工作总结
2014/12/09 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
休学证明范本
2015/06/19 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
python中super()函数的理解与基本使用
2021/08/30 Python