user2979409
user2979409

Reputation: 791

NodeJS - Downloading from Google Drive

I have this piece of code in order to download files from Google Drive:

function downloadDrive(fileId, callback) {
  var fileExt = fileId.split(".");
  var file = Date.now() + "." + fileExt[fileExt.length - 1];
  var dest = fs.createWriteStream("./files/"+file);
  service.files.get({
    auth: oauth2Client,
    fileId: fileExt[0],
    alt: "media"
  })
  .on("finish", function() {
    callback(file);
  })
  .on("error", function(err) {
    console.log("Error during download", err);
  })
  .pipe(dest);
}

It works very well on small files ~500Mb. However, when trying to download a quite a big gzip file ~3Gb, it throws the following error.

buffer.js:23
  const ui8 = new Uint8Array(size);
              ^

RangeError: Invalid typed array length
    at new Uint8Array (native)
    at createBuffer (buffer.js:23:15)
    at allocate (buffer.js:98:12)
    at new Buffer (buffer.js:53:12)
    at Function.Buffer.concat (buffer.js:225:16)
    at BufferList.copy (/Synology/server_Metagenomics/server/node_modules/googleapis/node_modules/google-auth-library/node_modules/request/node_modules/bl/bl.js:124:21)
    at BufferList.slice (/Synology/server_Metagenomics/server/node_modules/googleapis/node_modules/google-auth-library/node_modules/request/node_modules/bl/bl.js:99:15)
    at BufferList.toString (/Synology/server_Metagenomics/server/node_modules/googleapis/node_modules/google-auth-library/node_modules/request/node_modules/bl/bl.js:166:15)
    at Request.<anonymous> (/Synology/server_Metagenomics/server/node_modules/googleapis/node_modules/google-auth-library/node_modules/request/request.js:1035:36)
    at emitOne (events.js:82:20)
    at Request.emit (events.js:169:7)

I didn't find a lot of information about it. What is going on?

Upvotes: 1

Views: 1438

Answers (1)

atti
atti

Reputation: 180

You can try following to download file. The error seems to be because you are downloading large file.

var filename = 'zzz.txt';
var proxyUrl = "http://" + user + ":" + password + "@" + host + ":" + port;
var token = 'YOUR_TOKEN';

var req = request.get('https://www.googleapis.com/drive/v3/files/YOUR_FILE_ID?alt=media', {
    'auth': {
        'bearer': token
    },
    'proxy': proxyUrl
}).on('response', function(res) {

// create file write stream
var fws = fs.createWriteStream(filename);

// setup piping
res.pipe(fws);

res.on('err', function() {
    console.log("error occured.....");
});

res.on('end', function() {
    console.log('Done');
    // go on with processing
});
});

Upvotes: 1

Related Questions