无法在Angular中提供从IE下载的文件

时间:2017-10-11 11:43:48

标签: angular file typescript internet-explorer download

我正在尝试为我的用户生成一个文本文件,下面的代码在除了IE和Edge之外的所有浏览器中都能很好地完成这项工作(在后者中,我无法控制文件的名称,但它至少会产生)

emitFile(stage: any): void {
  const blob = new Blob([stage.elaboration], { type: "text/csv" });
  const url = window.URL.createObjectURL(blob);
  const anchor = document.createElement("a");
  anchor.href = url;
  anchor.download = "ff-rocks-ie-sucks.txt";
  anchor.click();
}

在这方面有an open issue ticket但是它已经过了18个月,最近的活动相当不紧急。似乎这是一个希望夭折的地方。

我没有找到任何合理的解决方法。我见过的那些人要么不工作,要么包含一个(非常明智但不可行)的建议,为了鸭子的缘故得到体面的浏览器。而且我认为这更像是一个错字而不是鸟类参考。

该怎么办呢?

1 个答案:

答案 0 :(得分:7)

您应该尝试使用msSaveBlob()而不是下载属性。

emitFile(stage: any): void {
  const blob = new Blob([stage.elaboration], { type: "text/csv" });
  window.navigator.msSaveBlob(blob,"ff-rocks-ie-sucks.txt");
}

它应该适用于IE和Edge。

编辑: IE,FF和Chrome的完整解决方案就是这样:

emitFile(stage: any): void {
  const blob = new Blob([stage.elaboration], { type: "text/csv" });
  if(window.navigator.msSaveOrOpenBlob) //IE & Edge
  {
    //msSaveBlob only available for IE & Edge
    window.navigator.msSaveBlob(blob,"ff-rocks-ie-sucks.txt");
  }
  else //Chrome & FF
  {
    const url = window.URL.createObjectURL(blob);
    const anchor = document.createElement("a");
    anchor.href = url;
    anchor.download = "ff-rocks-ie-sucks.txt";
    document.body.appendChild(anchor); //For FF
    anchor.click();
    //It's better to remove the elem
    document.body.removeChild(anchor);
  }
}