【发布时间】:2017-10-17 14:38:36
【问题描述】:
我有大约 10 个 .csv 和 10 个 .xlsx 销售项目文件,每个文件每天都被压缩并部署在我根据用户想要下载的文件发出的 API 获取请求指定的 URL 上。
所以基本上,当我调用 API 时,我会返回一个目标 URL 字符串,而且它很热,所以如果您导航到该 URL,文件会为用户下载,但这就是我的做法,我想知道是否有更好的方法或 Angular 方法?
这是当用户更改他们想要的文件的单选按钮时,我从 API 获取请求中获取 URL 的响应:
{
"fileUrl": "https://example.com.csv.zip"
}
然后我使用@ngrx store 将该目标网址设置为状态。这里就不多说了……
这是用户点击下载按钮时调用的方法:
downloadCSV() {
const url = this.state.destinationUrl;
this.http.get(url).subscribe(res => {
// Don't like modifying the DOM just to download a file :(
const link = document.createElement('a');
link.download = this.state.destinationUrl;
link.href = this.state.destinationUrl;
document.body.appendChild(link);
// Don't like forcing an event :(
link.click();
}, (error) => {
console.log('error fetching file download');
});
}
问题是,这看起来很老套,我正在寻找更好的解决方案。有没有更好的方法来做到这一点,保持我想避免弹出窗口阻止程序?我已经看到在 Angular 中使用了文件保护程序,但我认为我不能从 .zip 文件位置和我们的 FileSaver.saveAs(blob, 'example.zip') 创建一个 Blob。任何建议将不胜感激。
【问题讨论】:
-
你可以在标签页中打开它,让它下载,因为它是一个文件,大多数浏览器都会再次关闭标签页
-
看看这个答案:stackoverflow.com/a/39657478/5119765 它展示了如何从 URL 检索 PDF 到 blob。因此,您将能够使用
file-saver。
标签: javascript angular typescript