【发布时间】:2019-09-10 00:08:39
【问题描述】:
我的问题与this one 类似,但这是一篇没有太多上下文或细节的旧帖子,所以这是我得到的:
当我的组件调用下载文件方法时,该方法又调用下载文件服务,该服务从我的 API 发出 HTTP GET 请求,该请求将 blob 流式传输回服务。
组件:
this.svc.getDownloadFile(fileID, fileName).subscribe(res => {
console.log(res);
});
}
服务:
getDownloadFile(fileId: number, fileName: string): Observable<any> {
return this.http.get(this.downloadFileUrl + "/" + fileId, {
reportProgress: true,
observe: "events",
headers: this.getHeaders(),
responseType: "blob"
});
}
问题在于,因为它是一个 API 调用,所以 blob 通过 XHR 流式传输,我可以在 Chrome 的“网络”选项卡中看到它的下载及其进度。我遇到的问题是在 Chrome(或任何浏览器)中下载文件时通常会收到某种浏览器下载通知,这仅在整个响应完成后才会发生。
例如,我在数据库中有一个 50MB 的文件。用户单击链接以从 Angular 应用程序下载所述文件,该组件调用该服务,该服务又执行 API 调用,该调用从数据库中获取文件并将其作为 blob 响应流式传输。 Angular 接受此响应,等到它下载完所有 50MB 后,然后显示下载对话框。
API 将返回 Content Disposition 标头以及内容长度、内容类型、文件名等。我已经在谷歌上搜索了所有内容并搜索了一些东西来模仿这一点,我有点理解浏览器不会自动下载像往常一样,因为请求是通过 Angular 传递的,并且浏览器不会自动假设所有 blob XHR 都应该被保存。
我尝试使用:https://www.npmjs.com/package/streamsaver 但这个包实际上只处理已经存储的文件,而不是从 API 作为 blob 发送的文件。
【问题讨论】:
标签: angular