如何从节点从谷歌驱动器下载文件并将带有进度的流发送到客户端?

问题描述

我目前正在使用 api_key 从 angular 下载谷歌驱动器公共文件而无需身份验证。由于它是一个公共文件,我不需要身份验证。

我想向用户显示下载进度,所以这是我的设置:

download.component.ts

constructor(private service: DownloadsService) { }
ngOnInit(): {
    https://www.googleapis.com/drive/v2/files/<FILE_ID>?key=<API_KEY>&alt=media&source=downloadUrl
    const download$ = this.service.download(url,'filenametest');
}

download.service.ts

export class DownloadsService {

  constructor(private http: HttpClient) { }

  isHttpResponse<T>(event: HttpEvent<T>): event is HttpResponse<T> {
    return event.type === HttpEventType.Response;
  }

  isHttpProgressEvent(event: HttpEvent<unkNown>): event is HttpProgressEvent {
    return event.type === HttpEventType.DownloadProgress || event.type === HttpEventType.UploadProgress;
  }

  progress(saver?: (b: Blob) => void): (source: Observable<HttpEvent<Blob>>) => Observable<IDownload> {
    return (source: Observable<HttpEvent<Blob>>) =>
      source.pipe(
        scan((prevIoUs: IDownload,event: HttpEvent<Blob>): IDownload => {
          if (this.isHttpProgressEvent(event)) {
            return {
              progress: event.total
                ? Math.round((100 * event.loaded) / event.total)
                : prevIoUs.progress,state: 'IN_PROGRESS',content: null
            };
          }
          if (this.isHttpResponse(event)) {
            if (saver && event.body) {
              saver(event.body);
            }
            return {
              progress: 100,state: 'DONE',content: event.body
            };
          }
          return prevIoUs;
        },{ state: 'PENDING',progress: 0,content: null }
        )
      );
  }

  download(url: string,filename: string): Observable<IDownload> {
    return this.http.get(url,{
      reportProgress: true,observe: 'events',responseType: 'blob'
    }).pipe(this.progress(blob => this.saveBlob(blob,filename)));
  }

  saveBlob(blob: Blob,fileName: string): void {
    const link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
  }
}

如您所见,我在 angular http 请求中使用了 reportProgress: trueobserve: 'events'。我从 this tutorial 那里得到了这个解决方案,这个解决方案以一种可以向用户显示进度的方式流式传输数据。

它工作正常!。问题是这样我在客户端保存了 url,每个人都可以看到我的 file_idapi_key

所以我认为一个不错的解决方案是从 google drive -> node server -> angular client 创建一个三层流。这样我就可以将数据流式传输给用户,而我的信息将是保密的。

这可能吗?我找不到任何相关信息,因为所有教程和 stackoverflow 问题都与“如何从节点下载谷歌驱动器文件并保存它”有关。但那不是我想要的。我只是想以一种用户可以看到下载进度的方式将数据流式传输给用户

有人知道如何实现此解决方案的 node express 部分吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)