Я новичок в этом API Google Drive, поэтому я хочу создать страницу (сделанную с использованием angular 9), где у меня будут все файлы из определенной папки с моего диска Google в списке и, если щелкнуть по файлу загрузка начнется.
Итак, для этого я уже перечислил файлы с диска Google, используя googleapis из npm, но я ищу простой способ загрузки файла на стороне клиента, где backend включен на express js, учитывая ограничение квоты на загрузку с диска google.
Вот код моего angular компонента и сервиса
test.component .ts
download() {
this.driveService.driveDownload().subscribe(
res => {
console.log('success', res);
},
error => {
console.log('error for: ', error);
});
}
drive.service.ts
driveDownload(): Observable<any> {
return this.http.get(this.env.apiUrl + 'drive/download', { responseType: 'blob' })
.pipe(map(response => {
console.log('response got-->', response);
return response;
}));
}
Код на стороне сервера для обработки загрузки
export default (app: Router) => {
app.use('/drive', route);
route.get(
'/download',
async (req: Request, res: Response, next: NextFunction) => {
const logger = Container.get('logger');
logger.debug('Calling drive/download endpoint')
try {
const driveServiceInstance = Container.get(DriveService);
const r = await driveServiceInstance.download('1mH9sGldB-qp-TJNd6WhdOMzo54wgAA-N', req.header('Range'));
res.header(r.headers)
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodeURIComponent('test2.mp4')}`);
return res.send(r.data).status(200);
} catch (e) {
logger.error('? error: %o', e);
return next(e);
}
});
};
Функция DriveServiceInstance.download
public async download(fileId: string, range: string): Promise<any> {
const drive = await driveAuth.call().then(async (auth: OAuth2Client) => {
const drive = google.drive({ version: 'v3', auth });
return drive;
}).catch((err: any) => {
throw new Error('Drive auth error: ' + err);
});
return new Promise(async (resolve, reject) => {
drive.files.get(
{ fileId: fileId, alt: 'media' },
{
headers: {
Range: ''
},
responseType: 'stream'
}, (err: Error, res: any) => {
if (err) {
reject(err)
}
resolve(res);
});
});
}