AngularJS - 接收并下载 CSV

9

我正在使用一个nodeJS程序作为服务器,使用AngularJS Web应用程序作为客户端。

为了创建CSV,我正在使用"express-csv"库(https://www.npmjs.com/package/express-csv)

这是我的服务器端代码:

定义:

var app = express();
var csv = require('express-csv');

获取代码:

app.get('/exportDB', function(req, res){
    res.csv([
    ["a", "b", "c"]
  , ["d", "e", "f"]
  ]);

这是我的客户端代码:

$http.get("http://"+$localStorage.ip+":"+$localStorage.port+"/exportDB").success(function(response){
            // HERE I NEED A WAY TO DOWNLOAD THE RECEIVED CSV
        });

毋庸置疑,它已经到达了服务器,其它一切都正常工作,但我找不到下载CSV的方法。请帮助。

P.S

请不要说这是使用node.js和node-csv-parser(node模块)提示csv文件下载为弹出窗口的副本,因为那里并没有真正提到客户端。 此外,其他问题都集中在服务器端而不是客户端。 没有其他问题涉及AngularJS客户端。
5个回答

2

我遇到了与上面提到的解决方案相同的问题,它可以在Chrome和Firefox中正常工作,但在safari/IE中无法正常工作。

我尝试了以下hack方法,并且它对我有效:

var url="http://'+$localStorage.ip+':"+$localStorage.port+'/exportDB'; var form = angular.element("<form action='" + url +"'></form>"); form.submit();

文件下载将由浏览器自己处理。虽然有以下限制:

  1. 您将无法处理来自http get调用的错误:( 尝试使用javascript的try-catch块,但效果不佳...
  2. ..您将无法对此代码片段进行单元测试:( :(

还有另一种方法可行,它是 -

var url="http://'+$localStorage.ip+':"+$localStorage.port+'/exportDB'; $window.location.href = url;

欢迎提出建议和讨论!


2
您可以直接导航:
location.href = "http://"+$localStorage.ip+":"+$localStorage.port+"/exportDB";

它可以工作,但我得到了一个名为“exportDB”的文件,没有结束符号(如果我添加“.csv”就可以了)。你知道在发送之前如何在服务器上命名文件吗? - Guy Ben-Moshe
@GuyBen-Moshe,您应该设置标题 res.setHeader('Content-disposition', 'attachment; filename=' + filename); res.setHeader('Content-type', mimetype); - karaxuna

1
你可以创建一个标签并点击它:

    $http.get("http://"+$localStorage.ip+":"+$localStorage.port+"/exportDB").success(function(response) {
        var dataURI = 'data:application/octet-stream;base64,' + btoa(response);
        $('<a></a>').attr({
            download:  'db.csv',
            href: dataURI
        })[0].click();
    });

1

有几种下载csv的方法。第一种方法是创建一个标签并单击它

在下面的代码中添加mimeType:data:application/octet-stream

var a = document.createElement('a');
 a.href = 'data:'+mimeType+';charset=utf-8;base64,' + response;
 a.target = '_blank';
 a.download = "name the file here";
 document.body.appendChild(a);
 a.click(); 

但是这个解决方案在IE>9和Safari>6上不起作用,因为Safari不遵循锚标签的下载属性,所以对于Safari,您可以使用 filesaver.js,而在IE中,这个解决方案会起作用。
if (window.navigator.msSaveOrOpenBlob){
                // base64 string
                var base64str = response;

                // decode base64 string, remove space for IE compatibility
                var newstr =base64str.replace(/\s/g, '');
                var binary = atob(newstr);

                // get binary length
                var len = binary.length;

                // create ArrayBuffer with binary length
                var buffer = new ArrayBuffer(len);

                // create 8-bit Array
                var view = new Uint8Array(buffer);

                // save unicode of binary data into 8-bit Array
                for (var i = 0; i < len; i++) {
                 view[i] = binary.charCodeAt(i);
                }

                // create the blob object with content-type "application/csv"               
                var blob = new Blob( [view], { type: mimeType });
                window.navigator.msSaveOrOpenBlob(blob, "Name your file here");
            }

0

在这里,我试图让它变得简单。将您想要在文件中显示的所有后端记录分配给名为obj的变量。我只会说它是var obj = []。在函数内部添加以下代码。

var a = document.createElement("a");
var csvContent = "Name, Address\n";

for(var i =0; i <obj.lenght; i++ ) {
  var dataString = obj[i].name + ", " + obj[i].address + "\n";
  csvContent +=  dataString;  
}
a.href = 'data:attachment/csv;charset=utf-8,' + encodeURI(csvContent);
a.target = '_blank';
a.download = 'myFile.csv';
document.body.appendChild(a);
a.click(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接