【问题标题】:Trouble getting progress and file when downloading a file in Angular在 Angular 中下载文件时无法获取进度和文件
【发布时间】:2019-08-26 08:00:02
【问题描述】:

我有一个 Angular 应用程序,我只想下载一个文件。

到目前为止,这是我的代码:

this.fileNavigationService.downloadFile(element).subscribe(result => {
    this.generateDownload(result);
});

还有我的服务:

downloadFile(file: FileElement) {
    return this.http.get(this.apiUrl + '/downloadFile', { params: file.name, responseType: 'blob' });
}

现在,我想在下载文件时显示进度。在网上查了一下,发现了一个很有用的东西。我的服务现在看起来像这样:

downloadFile(file: FileElement) {
    const req = new HttpRequest('GET', '/downloadFile?path=' + file.name, {
      reportProgress: true,
    });

    return this.http.request(req).subscribe(event => {
      if (event.type === HttpEventType.DownloadProgress) {
        const percentDone = Math.round(100 * event.loaded / event.total);
        console.log(`File is ${percentDone}% downloaded.`);
      } else if (event instanceof HttpResponse) {
        console.log('File is completely downloaded!');
      }
    });
}

我可以在控制台中清楚地看到进度,但是,我现在有 2 个问题:

  • 我的代码永远不会进入最后一个if,即使下载似乎达到了 100%
  • 我组件中的代码在订阅方法上明显坏了

    “订阅”类型上不存在“订阅”属性。

但我似乎无法找到一种方法来使其正常工作,因此我可以获得进度和我的结果文件。

你有什么想法或例子可以帮助我吗?谢谢。

【问题讨论】:

  • .pipe( tap(...) ) 替换subscribe(...) 以通过Observable
  • 至于“最后一个如果没有触发”——不清楚,尝试输出每个事件的type。如果你真的得到了HttpResponse——那么你也可以尝试使用鸭式检查它,例如event.type === HttpEventType.Response

标签: angular rxjs observable angular-httpclient


【解决方案1】:

经过一番研究,感谢this answer,我终于设法解决了我的问题。

现在这是我的服务代码:

downloadFile(file: FileElement) {
  return this.http.get(
    this.apiUrl + '/downloadFile', 
    { 
        params: file.name, 
        responseType: 'blob',
        reportProgress: true,
        observe: 'events', 
        headers: new HttpHeaders({ 'Content-Type': 'application/json' }) 
    }
  );
}

在我的组件中:

this.fileNavigationService.downloadFile(element).subscribe(result => {
    if (result.type === HttpEventType.DownloadProgress) {
      const percentDone = Math.round(100 * result.loaded / result.total);
      console.log(percentDone);
    }
    if (result.type === HttpEventType.Response) {
      this.generateDownload(result.body);
    }
});

【讨论】:

  • 我认为你不需要在标题中定义另一个内容类型
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2018-05-30
  • 2022-08-09
  • 2020-02-07
  • 2020-12-18
  • 1970-01-01
相关资源
最近更新 更多