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 相关文章推荐
js 覆盖和重载 函数
Sep 25 Javascript
Javascript高级技巧分享
Feb 25 Javascript
使用js画图之画切线
Jan 12 Javascript
纯javascript实现图片延时加载方法
Aug 21 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
微信小程序商城项目之购物数量加减(3)
Apr 17 Javascript
Vue项目中添加锁屏功能实现思路
Jun 29 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
Mar 05 Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 Javascript
详解vue中使用微信jssdk
Apr 19 Javascript
基于JQuery实现页面定时弹出广告
May 08 jQuery
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.MVC的模板标签系统(三)
2006/09/05 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
简单的自定义php模板引擎
2016/08/26 PHP
php中请求url的五种方法总结
2017/07/13 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
jQuery bind事件使用详解
2011/05/05 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
Python简明入门教程
2015/08/04 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
区优秀教师事迹材料
2014/02/10 职场文书
三年级学生评语
2014/04/23 职场文书
商业项目策划方案
2014/06/05 职场文书
军训拉歌口号
2014/06/13 职场文书
社会发展项目建议书
2014/08/25 职场文书