angular - Angular 不会从流( StreamingResponseBody )中下载文件
问题描述
我正在使用 Angular 下载大文件,对于我使用 Spring Boot 的后端,这是端点的代码:
@RequestMapping(value = "/download", method = RequestMethod.GET)
public StreamingResponseBody download(@PathVariable String path) throws IOException {
final InputStream file =azureDataLakeStoreService.readFile(path);
return (os) -> {
readAndWrite(file , os);
};
}
private void readAndWrite(final InputStream is, OutputStream os)
throws IOException {
byte[] data = new byte[2048];
int read = 0;
while ((read = is.read(data)) >= 0) {
System.out.println("appending to file");
os.write(data, 0, read);
}
os.flush();
}
当我尝试使用 curl 获取文件时,它可以工作,并且我可以看到正在下载的文件并且它的大小正在增加:
curl -H "Authorization: Bearer <MyToken>" http://localhost:9001/rest/api/analyses/download --output test.zip
但是,当我尝试使用 Angular 下载文件时它不起作用,即使请求成功,我可以在日志中看到文本“附加到文件”多次显示,但浏览器上没有下载任何内容,这是我的代码:
this.http.get(url, { headers: headers, responseType: 'blob', observe: 'response' })
.subscribe(response => {
const contentDispositionHeader: string = response.headers.get('Content-Disposition');
const parts: string[] = contentDispositionHeader.split(';');
const filename = parts[1].split('=')[1];
const blob = new Blob([response.body], {
type: 'application/zip'
});
saveAs(blob, filename);
});
saveAs() 属于file-saver,顺便说一句,当我尝试将文件下载为 byte[] (没有流式传输)时,上面的代码有效。
我在互联网上只能找到这段代码,它在使用 angular 5 时使用 angularJs,任何人都可以指出问题所在!谢谢。
更新:
我可以看到文件正在谷歌浏览器的网络选项卡中下载,但我不知道文件保存在哪里。
解决方案
我尝试使用您的后端代码,但在角度我使用了这个:
window.location.href = "http://localhost:9001/rest/api/analyses/download";
它开始成功下载。
推荐阅读
- javascript - IE 11 v11 不尊重单台机器上输入的“禁用”属性
- reporting-services - 在 SSRS 中增加每页的行数
- c# - 在 ANTLR Lexer (C#) 中否定 POSIX 或 Unicode 字符类
- c# - BasicHttpBinding 未使用默认配置
- c# - 在连接或字符串构建期间使用 StringBuilder 而不是 String 的好处
- java - 龙目岛不与 Intellij 合作
- selenium - 限制要存储在 List 中的元素
- 硒/java - r - 在 R 中为满足条件的值添加前缀
- java - 如何使用 python 提取 Android APK 包 version_name?
- html - 导航栏品牌和移动下拉菜单在同一行引导程序 4