Angular 将文件保存为 csv 导致网络错误仅在 Chrome 上

Posted

技术标签:

【中文标题】Angular 将文件保存为 csv 导致网络错误仅在 Chrome 上【英文标题】:Angular save file as csv result in Failed- network error Only on Chrome 【发布时间】:2017-01-15 09:30:09 【问题描述】:

我正在使用以下代码将文件保存为 csv。

$scope.saveCSVFile = function (result)

    var a         = document.createElement('a');
    a.href = 'data:application/csv;charset=utf-8,' + encodeURIComponent(result.data);
    a.target      = '_blank';
    a.download    =  $scope.getFileNameFromHttpResponse(result);
    document.body.appendChild(a);
    a.click();
    $scope.isReportInProgress = false;
;

该文件在大多数情况下都可以正常工作,但由于某种原因,当文件大于 10MB 时,我会收到“失败 - 网络错误”。

它只发生在 chrome 上。

我尝试在网上搜索此问题,但找不到任何相关内容。

你能想出为什么会发生这种情况吗?或者可能使用其他适用于 chrome/firefox/IE 而不是我的函数的保存文件方法?

【问题讨论】:

【参考方案1】:

终于用这个了,希望能帮助下一个遇到这个问题的人:

 var blob = new Blob([result.data], type: 'text/csv');
            var filename =  $scope.getFileNameFromHttpResponse(result);
            if(window.navigator.msSaveOrOpenBlob) 
                window.navigator.msSaveBlob(blob, filename);
            
            else
                var elem = window.document.createElement('a');
                elem.href = window.URL.createObjectURL(blob);
                elem.download = filename;
                document.body.appendChild(elem);
                elem.click();
                document.body.removeChild(elem);
            

【讨论】:

FileSaver 在其他方面是保存 blob 客户端的好选择。它照顾浏览器差异 这救了我!我怀疑我需要使用 blob API,但不确定错误是否相关。非常感谢 工作得很好,tyvm 拯救了我的一天!谢谢;-) 不要忘记 URL.revokeObjectURL() 否则 blob 将不会被垃圾回收。【参考方案2】:

我遇到了类似的问题,但必须提供从服务器以 base64 格式发送的 zip 文件。对我有什么诀窍:

function downloadBlob(data, filename) 
    const blob = new Blob([new Buffer(data, 'base64')], type: 'application/octet-stream');

    if (window.navigator.msSaveOrOpenBlob) 
        window.navigator.msSaveBlob(blob, filename);
     else 
        const elem = window.document.createElement('a');
        elem.href = window.URL.createObjectURL(blob);
        elem.download = filename;
        document.body.appendChild(elem);
        elem.click();
        window.URL.revokeObjectURL(elem.href);
        document.body.removeChild(elem);
            


return (
  /* ... */
  <a href="#" onClick=() => downloadBlob(report.zip, `$report.filename.zip`)>
      Download <b>report.filename.zip</b>
  </a>
  /* ... */
);

我离开了这个函数,因为它在提供文件后撤销了 URL。

【讨论】:

以上是关于Angular 将文件保存为 csv 导致网络错误仅在 Chrome 上的主要内容,如果未能解决你的问题,请参考以下文章

如何将 API 数据保存到 csv 文件中?另外如何修复回溯错误?

使用 glob 读取多个 CSV 导致顺序错误 [重复]

csv文件格式问题

在文件保存时将 Angular 配置为“ng lint”

CSV 文件中的数字格式

将数据从 CSV 文件添加到 Pandas Dataframe 导致值错误