微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我目前正在使用 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 举报,一经查实,本站将立刻删除。