【问题标题】:Downloading progress in Google DriveGoogle 云端硬盘中的下载进度
【发布时间】:2017-04-11 08:27:08
【问题描述】:

在我的 Meteor 服务器应用程序中,我正在使用此代码从 Google Drive 下载文件,

var dest = fs.createWriteStream('/data/'+data.name);
        drive.files.get({
           fileId: data.id,
           alt: 'media',
           auth: jwtClient
        })
        .on('end', Meteor.bindEnvironment(function() {

        }))
        .on('error', function(err) {
          console.log('Error during download', err);
        })
        .pipe(dest);

如何获取下载进度?例如,我希望每 30 秒使用 console.log() 显示下载进度

我可以使用 .on('data') 吗?我正在使用 Google 提供的 google drive nodejs v3。

【问题讨论】:

  • 以前没有使用过 Google 驱动 SDK,但也许您可以获取文件大小(以字节为单位)以及流已处理和计算的字节以及其中的百分比。我认为虽然你不能通过直接管道读/写流来使用它。看看npmjs.com/package/stream-meter

标签: node.js google-drive-api google-drive-realtime-api


【解决方案1】:

您可以从 drive.files.list 中获取文件元(id、名称、大小)和文件名,然后您可以下载文件。

使用 Node.js Quickstart for google drive 进行身份验证。

我正在使用progress-stream 来衡量收到的数据百分比。

var callAfterDownload = function (fileName, callback) {
  drive.files.list({
    auth: oauth2Client,
    pageSize: 1,
    q: 'name=\'' + fileName + '\'',
    fields: 'nextPageToken, files(id, name, size)'
  }, function (err, response) {
    if (err) {
      console.log('The API returned an error: ' + err)
      callback(['Error while download'])
    } else {
      var files = response.files
      //when only one file is matched we will download
      if (files.length === 1) {

        var file = files.pop()
        console.log('%s (%s)', file.name, file.id)
        var dest = fs.createWriteStream(file.name)
        var progress = Progress({time:100, length: file.size})

        //downloading matched file from drive
        drive.files.get({
          auth: oauth2Client,
          fileId: file.id,
          alt: 'media'
        }).on('error', function (err) {
          console.log('Error during download', err)
          callback(['Error while download'])
        }).pipe(progress).pipe(dest)

        //checking progress of file
        progress.on('progress', function(progress) {
          console.log('download completed ' +progress.percentage.toFixed(2) + '%')
        });

        //when write stream has finally written to file
        dest.on('finish', callback)

      } else {
        console.log('EXITING......More than one/no file exist with same name, make sure you have unique file name.')
        callback()
      }
    }
  })
}


function downloadDriveFile () {
  var fileName = 'testfile.doc'
  callAfterDownload(fileName, function (err) {
    if(err) throw err
    //your logic to do anything with the file
  })
}

downloadDriveFile();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多