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与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
JavaScript中document.forms[0]与getElementByName区别
Jan 21 Javascript
js实现Select头像选择实时预览代码
Aug 17 Javascript
js控制多图左右滚动切换效果代码分享
Aug 26 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
详解在Angular项目中添加插件ng-bootstrap
Jul 04 Javascript
在vue中获取dom元素内容的方法
Jul 10 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
Nov 02 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 Javascript
9个JavaScript日常开发小技巧
Oct 06 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实现转换ubb代码的方法
2015/06/18 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
基于datagrid框架的查询
2013/04/08 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
python和C语言混合编程实例
2014/06/04 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
python退出循环的方法
2020/06/18 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
初中新生军训方案
2014/05/13 职场文书
三八节标语
2014/06/27 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
家长会主持词开场白
2015/05/29 职场文书
安全教育日主题班会
2015/08/13 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
解析MySQL binlog
2021/06/11 MySQL
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
python使用torch随机初始化参数
2022/03/22 Python