I have created a project on Google API’s developer console and enabled Google Drive API.
As well as I have created and downloaded Service account credentials .json file which I am using on Node.js backend server and connecting and uploading image files on google drive.
npm i googleapis
const { google } = require('googleapis');
let privatekey = require("./privatekey.json");
// configure a JWT auth client
let jwtClient = new google.auth.JWT(
privatekey.client_email,
null,
privatekey.private_key,
['https://www.googleapis.com/auth/drive']);
//authenticate request
jwtClient.authorize(function (err, tokens) {
if (err) {
console.log(err);
return;
} else {
console.log("Successfully connected to gdrive!");
}
});
//Google Drive API
let drive = google.drive('v3');
drive.files.list({
auth: jwtClient,
q: "name contains 'photo'"
}, function (err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
console.log(response.data);
var files = response.data.files;
if (files.length == 0) {
console.log('No files found.');
} else {
console.log('Files from Google Drive:');
for (var i = 0; i < files.length; i++) {
var file = files[i];
console.log('%s (%s)', file.name, file.id);
}
}
});
let fs = require('fs');
var fileMetadata = {
name: 'photo.png',
};
var media = {
mimeType: 'image/jpeg',
body: fs.createReadStream('files/photo.png'),
};
drive.files.create(
{
auth: jwtClient,
resource: fileMetadata,
media: media,
fields: 'id',
},
function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
}
},
);
When I upload the file I get the unique file ID in the response.
On the android application as well as on the front end react application I want to display this image file using URL.
I tried https://drive.google.com/open?id=PASTE YOUR ID HERE as well as http://drive.google.com/uc?export=view&id=PASTE YOUR ID HERE but it says you need access.
I also tried publishAuto:true
while uploading image but it didn’t work.
What’s the correct way to make the uploaded image file accessible via URL?
Advertisement
Answer
I solved it by creating a new folder and setting the permission for this folder as
type: anyone
role: reader
and then uploading images to this folder. When I want to display uploaded images I can display using below URL:
https://drive.google.com/thumbnail?id=YOUR IMAGE ID
Here is the complete code.
const { google } = require('googleapis');
let privatekey = require("./privatekey.json");
let drive = google.drive('v3');
// configure a JWT auth client - login and get the token
let jwtClient = new google.auth.JWT(
privatekey.client_email,
null,
privatekey.private_key,
['https://www.googleapis.com/auth/drive']);
//authenticate request
jwtClient.authorize(function (err, tokens) {
if (err) {
console.log(err);
return;
} else {
console.log("Successfully connected to gdrive!");
}
});
Run this code only once.
//For creating google drive folder
var fileMetadata = {
'name': 'ProductIcons',
'mimeType': 'application/vnd.google-apps.folder'
};
drive.files.create({
auth: jwtClient,
resource: fileMetadata,
fields: 'id'
}, function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('Folder Id: ', file);
}
});
//For changing folder permission
var fileId = 'FOLDER ID HERE';
var permission =
{
'type': 'anyone',
'role': 'reader',
}
;
let drive = google.drive('v3');
drive.permissions.create({
auth: jwtClient,
resource: permission,
fileId: fileId,
fields: 'id',
}, function (err, res) {
if (err) {
// Handle error...
console.error(err);
} else {
console.log('Permission ID: ', res)
}
});
And then upload as many images as you want in that folder using below code.
//For uploading image to folder
var folderId = 'FOLDER ID HERE';
let fs = require('fs')
var fileMetadata = {
'name': 'photo.png',
parents: [folderId]
};
var media = {
mimeType: 'image/jpeg',
body: fs.createReadStream('files/photo.png')
};
drive.files.create({
auth: jwtClient,
resource: fileMetadata,
publishAuto:true,
media: media,
fields: 'id'
}, function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
}
});