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 相关文章推荐
jquery模拟按下回车实现代码
Sep 20 Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
Jun 04 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
详解如何使用webpack在vue项目中写jsx语法
Nov 08 Javascript
解决vue.js 数据渲染成功仍报错的问题
Aug 25 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
Sep 11 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
Dec 25 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
js模拟实现百度搜索
Jun 28 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
Smarty模板快速入门
2007/01/04 PHP
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
优化Python代码使其加快作用域内的查找
2015/03/30 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
Python字符串处理实例详解
2017/05/18 Python
Python实现学生成绩管理系统
2020/04/05 Python
python实现公司年会抽奖程序
2019/01/22 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Opencv求取连通区域重心实例
2020/06/04 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
留学经费担保书
2014/05/12 职场文书
2014年教育工作总结
2014/11/26 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
python之基数排序的实现
2021/07/26 Python