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 相关文章推荐
json 入门基础教程 推荐
Oct 31 Javascript
jQuery前台数据获取实现代码
Mar 16 Javascript
简单实用jquery版三级联动select示例
Jul 04 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
jquery文档操作wrap()方法实例简述
Jan 10 Javascript
JavaScript中调用函数的4种方式代码实例
Jul 08 Javascript
JS 日期与时间戮相互转化的简单实例
Jun 22 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
May 25 Javascript
vue实现的网易云音乐在线播放和下载功能案例
Feb 18 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 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
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
用JS写的一个TableView控件代码
2010/01/23 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
详解js 创建对象的几种方法
2019/03/08 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
python如何使用腾讯云发送短信
2020/09/17 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
使用Python开发冰球小游戏
2022/04/30 Python