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 相关文章推荐
在表单提交前进行验证的几种方式整理
Jul 31 Javascript
ExtJs纵坐标值重复问题的解决方法
Feb 27 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
JavaScript实现的简单幂函数实例
Apr 17 Javascript
jquery实现未经美化的简洁TAB菜单效果
Aug 28 Javascript
JavaScript省市区三级联动菜单效果
Sep 21 Javascript
Javascript中作用域的详细介绍
Oct 06 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
详解Node.js使用token进行认证的简单示例
May 25 Javascript
微信小程序实现简单的select下拉框
Nov 23 Javascript
angular异步验证器防抖实例详解
Mar 31 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编写的抽奖程序中奖概率算法
2015/05/14 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
php数组指针操作详解
2017/02/14 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
儿童python练习实例
2018/05/27 Python
Python列表(List)知识点总结
2019/02/18 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
模具设计与制造专业应届生求职信
2013/10/18 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
认真学习保证书
2015/02/26 职场文书
计划生育个人总结
2015/03/02 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
解析Java异步之call future
2021/06/14 Java/Android
Docker部署Mysql8的实现步骤
2022/07/07 Servers