2017-04-11 169 views
0

在我的流星服务器的应用程序,我下载使用此代码从谷歌云端硬盘中的文件,下载进度

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。

+0

之前没有使用Google驱动器SDK,但可能可以获取以字节为单位的文件大小以及该流已处理和计算的字节数以及其中的百分比。尽管如此,我认为你不能通过直接管道化读/写流来使用它。看看https://www.npmjs.com/package/streammeter – Gntem

回答

0

您可以从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();