使用node.js和node-csv-parser(节点模块)提示csv文件下载,

最近我开始使用node.js。 虽然在我的一个项目中遇到了一个需求,但我面临的一个问题是,我应该能够dynamic地将一些数据写入一个csv文件,并让它作为一个popup窗口提示用户下载(带有保存和取消选项 – 正如我们平常一样看到)。 谷歌search了一段时间后,我决定使用csv npm模块https://github.com/wdavidw/node-csv-parser 。 我能够将数据写入文件并使用此模块进行保存。 我想提示一个popup式保存此文件与/不保存该文件。

我的代码看起来像这样:

// 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中设置内容types和内容处置方式?

任何帮助是极大的赞赏。 -谢谢

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

我做了这样的事情:

 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); 

以下解决scheme适用于Express

Express是进化的,而不是设置附件和内容types头,直接使用附件api http://expressjs.com/4x/api.html#res.attachment

注意: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"] ]); }); 

文档: https : //www.npmjs.com/package/express-csv

当你传递一个对象时,你需要显式地添加头(如果你想要的话)。 这是我使用npm mysql的例子

 router.route('/api/report') .get(function(req, res) { query = connection.query('select * from table where table_id=1;', function(err, rows, fields) { if (err) { res.send(err); } var headers = {}; for (key in rows[0]) { headers[key] = key; } rows.unshift(headers); res.csv(rows); }); }); 

看看这个答案: Nodejs发送文件作为回应

基本上,您不必将文件保存到硬盘驱动器。 相反,尝试直接发送到response 。 如果你使用的是类似Express的东西,那么它看起来像这样:

 var csv = require('csv'); req.get('/getCsv', function (req, res) { csv().from(req.body).to(res); });