2016-04-22 47 views
8

我正在使用nodeJS程序作为服务器和AngularJS Web应用程序作为客户端。AngularJS - 接收和下载CSV

要创建我使用了 “快车CSV” 库中的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

请不要说这是的Prompt a csv file to download as pop up using node.js and node-csv-parser (node module)重复,因为客户端是不是真的有提及。另外,其他问题都集中在服务器端而不是客户端。 AngularJS客户端没有其他问题。

回答

2

你可以只浏览:

location.href = "http://"+$localStorage.ip+":"+$localStorage.port+"/exportDB"; 
+0

它的工作原理,但我得到一个名为“exportDB”的文件没有结束。 (如果我添加'.csv'就行了)。您知道如何在发送之前在服务器中命名文件? –

+0

@ GuyBen-Moshe你应该设置标题'res.setHeader('Content-disposition','attachment; filename ='+ filename); res.setHeader('Content-type',mimetype);' – karaxuna

+0

不错,非常感谢! –

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的方式。第一种方法是创建一个标签,并单击它

添加mime类型在下面的代码数据:应用程序/八位字节流

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这个SOLUT离子将工作

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"); 
      } 
2

我面临同样的问题,上文提到的作品很好地Chrome和Firefox的解决方案,而不是使用Safari/IE。

尝试了下面的技巧,它的工作我 -

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

文件下载将通过浏览器本身进行处理。 虽然下面是限制它 -

  1. 您将无法处理您的HTTP错误(如果有的话)获得致电:(对于这个使用JavaScript的try-catch块尝试过,但没有做工精良...
  2. ..你不会成为能够单元测试这段代码:(:(

还有一个办法是工作,这是 -

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

欢迎提出建议和意见!