AngularJS – 接收和下载CSV
我使用nodeJS程序作为服务器,AngularJS Web应用程序作为客户端。
要创buildCSV,我使用“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。 请帮助。
PS
请不要说这是一个重复的提示csv文件下载popup使用node.js和node-csvparsing器(节点模块),因为客户端没有真正提到那里。 另外,其他问题都集中在服务器端而不是客户端。 没有其他的问题涉及AngularJS客户端。
你可以浏览:
location.href = "http://"+$localStorage.ip+":"+$localStorage.port+"/exportDB";
我面临同样的问题,上面提到的解决scheme与Chrome和Firefox,但Safari和IE浏览器不兼容。
尝试了下面的黑客,它为我工作 –
var url="http://'+$localStorage.ip+':"+$localStorage.port+'/exportDB'; var form = angular.element("<form action='" + url +"'></form>"); form.submit();
文件下载将由浏览器自己处理。 虽然以下是对它的限制 –
- 你将无法处理您的http获取电话(如果有的话):(为此尝试使用try-catch块的JavaScript,但没有很好地工作…
- ..你不能够unit testing这段代码:( 🙁
还有另外一种方法可行,
var url="http://'+$localStorage.ip+':"+$localStorage.port+'/exportDB'; $window.location.href = url;
build议和讨论欢迎!
你可以创build一个标签并点击它:
$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(); });
有下载csv的方法。 第一种方法是创build一个标签并点击它
在下面的代码数据中添加mimeType: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();
但是这个解决scheme在IE> 9和safari> 6上不起作用
因为safari不会跟随锚标签的下载属性
所以对于safari你可以使用filesaver.js
和IE这个解决scheme将工作
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"); }