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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
Apr 05 Javascript
js函数的引用, 关于内存的开销
Sep 17 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
解决js图片加载时出现404的问题
Nov 30 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
Apr 25 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 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
yii通过小物件生成view的方法
2016/10/08 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
Three.js学习之网格
2016/08/10 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
Python 查看文件的编码格式方法
2017/12/21 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
如何使用Python 打印各种三角形
2019/06/28 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
校园主题婚礼活动策划方案
2014/09/15 职场文书
元旦标语大全
2014/10/09 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS
MySQL优化之慢日志查询
2022/06/10 MySQL