Загружайте файлы с Google Drive, используя expressjs в качестве бэкэнда и angular 9 в веб-интерфейсе - PullRequest
0 голосов
/ 13 апреля 2020

Я новичок в этом 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);
        });
    });
  }
...