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 10 Javascript
从js向Action传中文参数出现乱码问题的解决方法
Dec 29 Javascript
javascript简单实现命名空间效果
Mar 06 Javascript
js实现按Ctrl+Enter发送效果
Sep 18 Javascript
jQuery实现行文字链接提示效果的方法
Mar 10 Javascript
javascript实现详细时间提醒信息效果的方法
Mar 11 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
Oct 14 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
简单实现JS计算器功能
Dec 21 Javascript
JavaScript无操作后屏保功能的实现方法
Jul 04 Javascript
Nuxt.js之自动路由原理的实现方法
Nov 21 Javascript
node.js制作一个简单的登录拦截器
Feb 10 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 传值赋值与引用赋值的区别
2010/12/29 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
js获取变量
2006/08/24 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
python import 上级目录的导入
2020/11/03 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
个人简历中的自我评价怎么写
2014/01/26 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
学习决心书范文
2014/03/11 职场文书
老龄工作先进事迹
2014/08/15 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
初二物理教学反思
2016/02/19 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书