使用node.js和node csv解析器(节点模块)弹出提示下载csv文件
最近我开始使用node.js。当我在我的一个项目中完成一个需求时,我面临一个问题,我应该能够将一些数据动态写入csv文件,并让它作为弹出窗口提示用户下载(如我们通常看到的,带有保存和取消选项)。在谷歌搜索了一段时间后,我决定使用csv npm模块。我能够将数据写入文件并使用此模块进行保存。我想提示一个弹出窗口来保存此文件,同时保存/不保存该文件 我的代码如下所示:使用node.js和node csv解析器(节点模块)弹出提示下载csv文件,node.js,csv,export,export-to-csv,Node.js,Csv,Export,Export To Csv,最近我开始使用node.js。当我在我的一个项目中完成一个需求时,我面临一个问题,我应该能够将一些数据动态写入csv文件,并让它作为弹出窗口提示用户下载(如我们通常看到的,带有保存和取消选项)。在谷歌搜索了一段时间后,我决定使用csv npm模块。我能够将数据写入文件并使用此模块进行保存。我想提示一个弹出窗口来保存此文件,同时保存/不保存该文件 我的代码如下所示: // Sample Data var data = [["id", "subject1", "subject2",
// Sample Data
var data = [["id", "subject1", "subject2", "subject3"], ["jack", 85, 90, 68], ["sam", 77, 89, 69]]
// Server Side Code
var csv = require('../../node_modules/csv');
var fs = require('fs');
createCSV = function(data, callback) {
csv().from(data).to(fs.createWriteStream('D:/test.csv')) // writing to a file
}
// Client side call sample
$("#exportToCSV").click(function() {
callToServer.createCSV(data);
return false;
});
就编写csv文件而言,这是很好的
- 我想立即提示用户下载此文件
- 如果可以在不保存文件的情况下完成此操作,那就太好了
- 如何像在PHP中那样设置内容类型和内容配置
响应
。如果您使用的是Express之类的工具,则其外观如下:
var csv = require('csv');
req.get('/getCsv', function (req, res) {
csv().from(req.body).to(res);
});
我是这样做的:
http.createServer(function(request, response) {
response.setHeader('Content-disposition', 'attachment; filename=testing.csv');
response.writeHead(200, {
'Content-Type': 'text/csv'
});
csv().from(data).to(response)
})
.listen(3000);
以下解决方案适用于Express Express经过改进,不再设置附件和内容类型头,而是直接使用附件api 注意:attachment()不传输文件,它只是在头中设置文件名
response.attachment('testing.csv');
csv().from(data).to(response);
Express csv是一个很好的模块,用于将csv内容从node.js服务器写入流,并作为响应发送到客户端(并作为文件下载)。非常容易使用
app.get('/', function(req, res) {
res.csv([
["a", "b", "c"]
, ["d", "e", "f"]
]);
});
文件:
当您传递一个对象时,您需要显式地预加标题(如果您需要的话)。下面是我使用
Manish Kumar的答案非常准确-只是想包含一个Express 4语法变体来实现这一点:
function(req, res) {
var csv = GET_CSV_DATA // Not including for example.
res.setHeader('Content-disposition', 'attachment; filename=testing.csv');
res.set('Content-Type', 'text/csv');
res.status(200).send(csv);
}
我使用的不是express,而是node.js的自定义框架。不管怎样,
http
模块都会使用相同参数的回调来响应请求,函数(请求,响应)
。我认为您应该能够将CSV的结果直接发送到响应
。请注意,完成上述服务器代码后,将客户端location.href链接到节点请求url[无需ajax调用]。有关Express 4语法的快速说明:res.setHeader('Content-disposition','attachment;filename=testing.CSV');res.set('Content-Type','text/csv');资源状态(200)。发送(csv);没有csv库,也没有express,而不是csv()行,您可以执行response.write(myCSVText);resonse.end();我觉得将setHeader
与set
混用是令人困惑和不一致的。尽管他们做同样的事情,但他们来自不同的地方。使用setHeader()
来自NodeJS的http
模块。如果您使用res.set
,即来自Express framework;如果给它一个对象,它允许设置多个标题:res.set({'Content-Disposition':'attachment;filename=testing.csv','Content-Type':'text/csv'})
function(req, res) {
var csv = GET_CSV_DATA // Not including for example.
res.setHeader('Content-disposition', 'attachment; filename=testing.csv');
res.set('Content-Type', 'text/csv');
res.status(200).send(csv);
}