13

最近我开始使用 node.js。在我的一个项目中完成要求时,我遇到了一个问题,我应该能够动态地将一些数据写入 csv 文件,并让它作为弹出窗口提示用户下载(带有保存和取消选项 - 就像我们通常一样看)。谷歌搜索了一段时间后,我决定使用 csv npm 模块https://github.com/wdavidw/node-csv-parser。我能够将数据写入文件并使用此模块保存。我想提示一个弹出窗口来保存这个文件,有/没有保存文件。

我的代码看起来像这样:

    // 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 中那样设置内容类型和内容处置

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

4

5 回答 5

36

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

}
于 2015-11-06T19:29:40.037 回答
15

我做了这样的事情:

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);
于 2012-11-08T07:44:51.387 回答
12

以下解决方案适用于 Express

express是进化的,不用设置附件和内容类型header,直接使用附件api http://expressjs.com/4x/api.html#res.attachment

注意:附件()不传输文件,它只是在标题中设置文件名。

response.attachment('testing.csv');
csv().from(data).to(response);
于 2014-06-16T11:38:55.977 回答
3

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);
            });
    });
于 2015-02-09T01:05:48.073 回答
0

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

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

var csv = require('csv');
req.get('/getCsv', function (req, res) {
    csv().from(req.body).to(res);
});
于 2012-10-25T18:29:43.897 回答