Node.JS段点续传:Nginx配置文件分段下载功能的实现方法_node.js

在Node.JS中可以配置这个标签来实现文件的分段下载。这篇文章给大家介绍了Node.JS段点续传:Nginx配置文件分段下载功能的实现方法,需要的朋友参考下吧

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超过文件尺寸

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

vue 多入口文件搭建 vue多页面搭建的实例讲解

一种angular的方法级的缓存注解(装饰器)

解决vue 路由变化页面数据不刷新的问题

项目中遇到:

downloadFilePart :function(uri,uridownload,filename,event) {
  var request = require('request')
  const SINGLE = 1024 * 1024 * 1024 ;
  const file =path.join(store.globalData.storePath, filename);
  var fs = require('fs');
  request(
    {
    method: 'GET',
    uri: uri,
    }, 
    (err, res) => {
    const size = Number(res.headers['content-length']); 
    let length = 1;
    if (size>SINGLE) {
      length = parseInt(size / SINGLE)+1;
    }
    var num = 0;
    for (let i=0; i<length;i++) {
      let start = i * SINGLE;
      let end = i == length-1 ?  size - 1: (i + 1) * SINGLE - 1;
      request({
        method: 'GET',
        uri: uridownload,
        headers: {
            'range': `bytes=${start}-${end}`
        },
      }).pipe(fs.createWriteStream(file, {flags:'w',start, end})).on('close', function (a) {
        num++
        console.info('%c下载备份案件数据-'+start+'-时间:' + new Date().getTime(), "color:red")
        if (num == length) {//必须接受全部请求之后再发送下载完成的返回,否则zip文件数据异常
          event.sender.send('downloadFile-reply', 'success'); // 异步返回请求
        }
      });
    }
  })
},
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值