google-api-nodejs-client icon indicating copy to clipboard operation
google-api-nodejs-client copied to clipboard

My pdfs are coming out blank after using Drive Api, drive.files.get(fileId)...

Open Salas123 opened this issue 3 years ago • 0 comments

I am building a personal website where I am trying to create the ability for a user to download my resume through the (React) client side of my web app from an AWS Lambda function. I have tried using FileSaver and window.open(req.url) to prompt the user to download my resume which successfully prompts the user. However, when I open up the file, I can see the pages but they are blank.

I have been only testing this locally and fair warning I am still learning AWS Lambda so, any pointers would help me too.

GoogleConn.js (handler function):

` const {google} = require('googleapis'); const fs = require('fs');

const CLIENT_ID = 'xxxx'; const CLIENT_SECRET=xxx; const REDIRECT_URI ='https://developers.google.com/oauthplayground';

const REFRESH_TOKEN ='xxx';

const fileID = 'xxx';

const filePath = fs.createWriteStream("/tmp/resume.pdf");

const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI);

module.exports.driveDownload = async function (event, context) { await oauth2Client.setCredentials({refresh_token: REFRESH_TOKEN});

const drive = await google.drive({version: 'v3', auth: oauth2Client});

console.log('successfully passed google drive initialization!');


await drive.files.get({ fileId: fileID, alt: 'media',}, {responseType: 'stream'}).then(res => {
   res.data.on('end', () => {console.log('Done downloading')})
       .on('error', (err) => {console.log('Error on downloading: ' + err)})
       .on('data', d =>{
           console.log(`Data length being downloaded... ${d.length}`);
       })
       .pipe(filePath);
});

return filePath.path;

} `

App.js (lambda function) ` const express = require('express') const bodyParser = require('body-parser') const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware')

// declare a new express app const app = express();

const googleConn = require('./googleconn');

app.use(bodyParser.json()) app.use(awsServerlessExpressMiddleware.eventContext())

// Enable CORS for all methods app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "") res.header("Access-Control-Allow-Headers", "") next() });

app.get('/downloadresume', function(req, res) {

googleConn.driveDownload(this, this) .then(r => {res.sendFile(r, {}, err => { console.log(err); })}) .catch(err =>{res.json({error: 'it did NOT work :/', body: err.toString()})});

});

app.listen(5000, function() { console.log("App started") });

// Export the app object. When executing the application local this does nothing. However, // to port it to AWS Lambda we will create a wrapper around that will load the app from // this file module.exports = app

`

AboutMeSection.js (client-side) ` function AboutMeSection(){

 async function download_resume() {
   await API.get('DownloadResumeAPI','/downloadresume', {
       responseType: 'blob'
   })
       .then(res =>{
            FileSaver.saveAs(res, 'resume.pdf');
       })
       .catch(err => {console.error(err)});

}



return(<div> {// myAppStuff ...} </div>);

}

export default AboutMeSection; `

Salas123 avatar Apr 27 '22 03:04 Salas123