使用node.js和node csv解析器(节点模块)弹出提示下载csv文件

使用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",

最近我开始使用node.js。当我在我的一个项目中完成一个需求时,我面临一个问题,我应该能够将一些数据动态写入csv文件,并让它作为弹出窗口提示用户下载(如我们通常看到的,带有保存和取消选项)。在谷歌搜索了一段时间后,我决定使用csv npm模块。我能够将数据写入文件并使用此模块进行保存。我想提示一个弹出窗口来保存此文件,同时保存/不保存该文件

我的代码如下所示:

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

}