将冗长的数据下载为CSV文件

我需要将视图中显示的表格的内容作为CSV文件下载。 我有代码正确格式化表的内容,以便它可以存储为一个.csv文件(例如,列分隔符是一个逗号,表中的每个logging是在一个新的行)。

所以,在我的控制器中,我有以下代码:

window.location.href = '/download?data=' + encodeURIComponent($scope.csvString); 

我正在使用NodeJs的服务器部分。 在这里,我有以下路由处理程序:

 app.get('/download', function (req, res) { var data = req.query.data; res.attachment('data.csv'); res.setHeader('Content-Type', 'text/csv'); res.end(data); }); 

这工作得很好。 下载工作和下载的文件中的数据是完美的CSV格式。 没有问题。

当表中logging太多时,即数据量巨大时,就会出现问题。 由于这一点,查询参数是非常巨大的,我认为它超过了限制,因此,GET请求返回一个400(错误请求)错误 – 请注意,根据我的分析,请求永远不会到达服务器,而是我观察到请求使用Chrome开发者工具失败。 在浏览器中,URL只是www.my_domain.com/download?data=the_lengthy_data 。 而已。 网页空白/空白,并且没有文件被下载。

因此,我想知道如何下载冗长的数据? 我遇到的所有示例都执行GET请求,因此我必须将冗长的数据作为查询parameter passing。 还有其他的方法吗?

对于你的问题不是一个真正的答案,而是从外观上来看,你试图“强制”下载客户端上生成的数据。 那么在这种情况下,您可以创build一个数据URI,直接在其中包含数据。

你的angularJS模板:

 <a href="data:base64,{{btoa(csvString)}}" download>Download CSV</a> 

你的控制器:

 $scope.btoa = function (val) { return btoa(val); }; 

因此,您的DOM应该看起来像:

 <!-- The link contains data to the CSV string "a,b,c" --> <a href="data:text/csv;base64,YSxiLGM=" download>Download CSV</a> 

点击链接下载CSV文件。

编辑

您也可以使用名为FileSaver.js的库强制下载string。

像往常一样,你会得到的CSV,但这一次,你会把它转换成一个BLOB。

 var csvBlob = new Blob([$scope.csvString], { type: 'text/csv;charset=utf-8' }); 

然后,你可以调用FileSaver.js的saveAs函数。

 saveAs(csvBlob, 'mydata.csv'); 

你对URL中的字符限制是正确的。 一般来说,冗长的数据是通过身体传递的,因为这在理论上没有字符限制。

但是,您应该避免尝试在GET请求中传递正文。 发送方法的XMLHttpRequest规范说 – “如果请求方法是GET或HEAD,则将数据设置为空。”

所以我build议你使用一个POST请求并在你的主体中传递你的参数。 因此,您还需要使用app.post('download',…)重写处理程序,然后parsingrequest.body以获取这些参数。

同样从我的理解你正在做什么,POST似乎是更合适的HTTP动词,因为你提供了一个数据块进行处理,并由服务器交回。

我们需要改变nodejs代码如下。 Nodejs代码

  function downloadableFile(req, res) { res.attachment(document.title); var bufferStream = new stream.PassThrough(); // we read the file in buffer. bufferStream.end(new Buffer(document.buffer)); return bufferStream.pipe(res); } 

Angularjs不理解二进制数据。 所以在前端我们可以使用第三方工具,如FileSaver.js'

var csvBlob = new Blob([$ scope.csvString],{type:'text / csv; charset = utf-8'}); saveAs(csvBlob,'mydata.csv');

或者我们可以使用这样的angularjs代码。 Angularjs代码。

  downloadDocument = function (path,id,type) { $http.get(path).then(function (data) { if (data.status === 404) { mpToastService.showToastHeader('error', 'Error downloading document'); } else { var blob = new Blob([data.data],{ type: type + ";charset=utf-8;" }); $("#" + id).attr("href", window.URL.createObjectURL(blob)); document.getElementById(id).click(); } }); } //In html file, we need to include these two lines. <a ng-click="downloadDocument(document.path,document.id,document.mimeType)" >document.title</a> <a id="document.id"></a> 

这个angular码将在前端下载二进制数据,然后popup下载模式,在stream行的浏览器中没有任何数据限制。 但一般情况下,除客户特殊要求外,这不是好的做法。