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面向对象编程
Nov 15 Javascript
文本框输入时 实现自动提示(像百度、google一样)
Apr 05 Javascript
中文字符串截取的js函数代码
Apr 17 Javascript
jQuery Validation PlugIn的使用方法详解
Dec 18 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
Vue.js中兄弟组件之间互相传值实例
Jun 01 Javascript
JS判断一个数是否是水仙花数
Jun 11 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
Sep 03 jQuery
微信小程序CSS3动画下拉菜单效果
Nov 04 Javascript
js序列化和反序列化的使用讲解
Jan 19 Javascript
react基本安装与测试示例
Apr 27 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
Jul 20 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/03/03 PHP
php之XML转数组函数的详解
2013/06/07 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
简单的三步vuex入门
2018/05/20 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
详解Python3中yield生成器的用法
2015/08/20 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python实现最大优先队列
2019/08/29 Python
wxPython实现列表增删改查功能
2019/11/19 Python
如何在django中运行scrapy框架
2020/04/22 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
土地转让协议书范本
2014/04/15 职场文书
办公用品质量保证书
2015/05/11 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server