Skip to content

Instantly share code, notes, and snippets.

@davestevens
Last active March 15, 2023 16:20
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save davestevens/6f376f220cc31b4a25cd to your computer and use it in GitHub Desktop.
Save davestevens/6f376f220cc31b4a25cd to your computer and use it in GitHub Desktop.
Download images from Google Drive folder using Node.js Google library
var google = require("googleapis"),
drive = google.drive("v2"),
fs = require("fs");
var config = {
"client_id": "client_id",
"client_secret": "client_secret",
"scope": "scope",
"redirect_url": "redirect_rul",
"tokens": {
"access_token": "access_token",
"token_type": "Bearer",
"id_token": "id_token",
"refresh_token": "refresh_token",
"expiry_date": "expiry_date"
}
};
function buildClient() {
var client = new google.auth.OAuth2(
config.client_id,
config.client_secret,
config.redirect_url
);
client.setCredentials(config.tokens);
return client;
}
var client = buildClient(),
folderId = "folderId"; // The Google Drive Folder Id
// Request all image files from folder
drive.children.list({
auth: client,
folderId: folderId,
q: "mimeType contains 'image' and trashed = false"
}, function(error, response) {
if (error) { return console.log("ERROR", error); }
response.items.forEach(function(item) {
var file = fs.createWriteStream("./" + item.title);
file.on("finish", function() {
console.log("downloaded", item.title);
});
// Download file
drive.files.get({
auth: client,
fileId: item.id,
alt: "media"
}).pipe(file);
});
});
@rotimi-best
Copy link

This code didn't work for me. I got an error that drive.files.get.pipe is not a function Instead this worked for me

drive.files.get(
  {fileId: fileId, alt: ‘media’}, {responseType: ‘stream’},
  (err, res) => {
     res.data
     .on(‘end’, () => {
        console.log(‘Done’);
     })
     .on(‘error’, err => {
        console.log(‘Error’, err);
     })
     .pipe(dest);
}

@erIamshivani
Copy link

This code didn't work for me. I got an error that drive.files.get.pipe is not a function Instead this worked for me

drive.files.get(
  {fileId: fileId, alt: ‘media’}, {responseType: ‘stream’},
  (err, res) => {
     res.data
     .on(‘end’, () => {
        console.log(‘Done’);
     })
     .on(‘error’, err => {
        console.log(‘Error’, err);
     })
     .pipe(dest);
}

@rotimi-best
While using same code, I get error as
(node:17335) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'data' of undefined. Can you help?

@rotimi-best
Copy link

This code didn't work for me. I got an error that drive.files.get.pipe is not a function Instead this worked for me

drive.files.get(
  {fileId: fileId, alt: ‘media’}, {responseType: ‘stream’},
  (err, res) => {
     res.data
     .on(‘end’, () => {
        console.log(‘Done’);
     })
     .on(‘error’, err => {
        console.log(‘Error’, err);
     })
     .pipe(dest);
}

@rotimi-best
While using same code, I get error as
(node:17335) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'data' of undefined. Can you help?

@erIamshivani Can you please show me the result of console.log(res)?

@davestevens
Copy link
Author

davestevens commented Nov 25, 2019

You should add:
if (err) { return console.log("ERROR", err); }
i think thats why res is undefined.

drive.files.get(
  {fileId: fileId, alt: 'media'}, {responseType: 'stream'},
  (err, res) => {
     if (err) { return console.log("ERROR", err); 
     res.data
     .on('end', () => {
        console.log(‘Done’);
     })
     .on('error', err => {
        console.log(‘Error’, err);
     })
     .pipe(dest);
}

@erIamshivani
Copy link

Thank you for responding.
But this answer helped me before I checked your response.

@rotimi-best
Copy link

@davestevens that is very correct.

@erIamshivani So what did you do differently?

@elvisciotti
Copy link

elvisciotti commented Jul 16, 2020

This one works as well

drive.files.get({fileId: randomFile.id, alt: 'media'}, {responseType: 'stream'}) .then((res) => res.data.pipe(dest)) .catch(err => console.log(err));

@ramyareye
Copy link

final code for me

 const fileWrite = fs.createWriteStream('./' + 'a.png');
  fileWrite.on('finish', function () {
    console.log('downloaded', 'a.png');
  });

  const file = await service.files.get(
    {
      auth,
      fileId,
      alt: 'media',
    },
    { responseType: 'stream' }
  );

  if (file) {
    file.data
      .on('end', () => {
        console.log('Done');
      })
      .on('error', (err) => {
        console.log('Error', err);
      })
      .pipe(fileWrite);
  }

or

const fileWrite = fs.createWriteStream('./' + 'a.png');
  fileWrite.on('finish', function () {
    console.log('downloaded', 'a.png');
  });

  const drive = google.drive('v3');

  drive.files.get(
    { fileId, auth, alt: 'media' },
    { responseType: 'stream' },
    (err, res) => {
      if (err) {
        throw err;
      }

      if (res) {
        res.data
          .on('end', () => {
            console.log('Done');
          })
          .on('error', (err) => {
            console.log('Error', err);
          })
          .pipe(fileWrite);
      }
    }
  );

@enchque
Copy link

enchque commented Mar 15, 2023

@davestevens thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment