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 相关文章推荐
javascript 文档的编码问题解决
Mar 01 Javascript
Javascript this指针
Jul 30 Javascript
JQuery 1.4 中的Ajax问题
Jan 23 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
May 21 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
js操作table元素实现表格行列新增、删除技巧总结
Nov 18 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
JS利用cookies设置每隔24小时弹出框
Apr 20 Javascript
element中的$confirm的使用
Apr 26 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
关于文本留言本的分页代码
2006/10/09 PHP
一个用于网络的工具函数库
2006/10/09 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
母亲80寿诞答谢词
2014/01/16 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
民间借贷协议书范本
2014/10/01 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL