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弹出填写提示效果代码
Apr 16 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
JS和JQ的event对象区别分析
Nov 24 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
javaScript中定义类或对象的五种方式总结
Dec 04 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 Javascript
vue项目上传Github预览的实现示例
Nov 06 Javascript
你或许不知道的一些npm实用技巧
Jul 04 Javascript
小程序富文本提取图片可放大缩小
May 26 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
Jan 29 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
php Undefined index的问题
2009/06/01 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
简单的自定义php模板引擎
2016/08/26 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
详解Vite的新体验
2021/02/22 Javascript
python 把列表转化为字符串的方法
2018/10/23 Python
浅析python的优势和不足之处
2018/11/20 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
写给女朋友的道歉信
2014/01/12 职场文书
作风建设演讲稿
2014/05/23 职场文书
假面舞会策划方案
2014/05/29 职场文书
中国梦团日活动总结
2014/07/07 职场文书
支教个人总结
2015/03/04 职场文书
大学生团日活动总结
2015/05/06 职场文书
结婚典礼致辞
2015/07/28 职场文书
学生病假条怎么写
2015/08/17 职场文书
golang语言指针操作
2022/04/14 Golang