Search code examples
google-apigoogle-drive-apigoogle-api-nodejs-client

Getting binary file content instead of UTF-escaped using file.get


I'd like to know if it's possible to get exact binary data using callback from drive.files.get method of NodeJS Google API. I know that object returned by calling this API endpoint is a normal request object that could be e.g. piped like this:

drive.files.get({
  fileId: fileId,
  alt: 'media'
}).pipe(fs.createWriteStream('test'));

However I would like to know if it's possible to get binary data from within callback using this syntax:

drive.files.get({
  fileId: fileId,
  alt: 'media'
}, function(err, data) {
   // Here I have binary data exposed
});

As far as I know, it should be possible to get that kind of data from request during its creation, passing {encoding: null} in request options object like this:

 var requestSettings = {
   method: 'GET',
   url: url,
   encoding: null // This is the important part
};
request(requestSettings, function(err, data) {/.../})` 

however it seems that Google obscures this configuration object in its library.

So my question is - is it possible to do so without interfering/hacking the library?


Solution

  • Ok, so i found answer that could be useful for others :) Aforementioned drive.files.get method returns Stream object, so it could be directly handled using proper event handlers. Then, buffer parts could be concatenated into one part and sent back in callback like this:

    var stream = drive.files.get({
      fileId: fileId,
      alt: 'media'
    });
    
    // Build buffer
    var chunks = [];
    stream.on('data', (chunk) => {
      chunks.push(chunk);
    });
    stream.on('end', () => {
      return cb(null, Buffer.concat(chunks));
    });