【问题标题】:Download csv file node.js下载 csv 文件 node.js
【发布时间】:2016-02-01 19:34:06
【问题描述】:

我正在使用 node.js 构建一个应用程序并尝试将数据下载为 csv 文件。为此,我正在使用 json2csv (https://www.npmjs.com/package/json2csv)。但是,按照我的配置方式,.csv 文件存储在我的应用程序的根目录中。我希望将文件作为下载发送给用户 - 例如,该文件应出现在用户的 /downloads 文件夹中。这是我当前的代码:

var fields = ['car', 'price', 'color'];
var myCars = [
  {
    "car": "Audi",
    "price": 1,
    "color": "blue"
  }, {
    "car": "BMW",
    "price": 1,
    "color": "black"
  }, {
    "car": "Porsche",
    "price": 1,
    "color": "green"
  }
];

json2csv({ data: myCars, fields: fields }, function(err, csv) {
  if (err) console.log(err);
  fs.writeFile('file.csv', csv, function(err) { //currently saves file to app's root directory
    if (err) throw err;
    console.log('file saved');
  });

});

var file = '../software-project-metric-dashboard/file.csv';
res.download(file, 'testfile.csv'); 

有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 您是或打算使用 express 之类的框架,还是只想拥有一个仅用于此用途的服务器?
  • 我正在使用 express 框架@cviejo
  • 试试这个,如果遇到任何问题,请返回:stackoverflow.com/questions/7288814/…
  • 不要使用 fs.writeFile,而只是发送具有正确内容类型的内容,就像您将 html 内容发送到客户端一样。

标签: node.js csv download


【解决方案1】:

您可以使用 npm 包轻松实现

在快递服务器上:

    const csvwriter = require('csv-writer');
    let createCsvWriter = csvwriter.createObjectCsvWriter;
    router.get('/downloadcsvfromJSON', (req, res) => {
         const dataArray= [{"id":"1","name":"BOB"},{"id":"2","name":"JACK"}];
         const path = 'sample.csv';
         const csvWriter = createCsvWriter({
           path: path,
           header: [{ id:'id',title:'ID'},{id:'name',title:'Name' }]});
         });
         try 
         {
              csvWriter.writeRecords(userLogsArray)
              .then(() => {res.download(path);});
         }
         catch (error) 
         {
           console.log(error);
         }

在浏览器上:

http://localhost:3000/downloadcsvfromJSON/

您将能够下载 csv 文件。

【讨论】:

    【解决方案2】:

    如果您使用 express,请使用 res.send。

    你必须定义一个看起来像这样的 HTTP GET 路由:

    app.get("/pathToYourDownload", function (req, res) {
      json2csv({ data: myCars, fields: fields }, function(err, csv) {
        res.setHeader('Content-disposition', 'attachment; filename=data.csv');
        res.set('Content-Type', 'text/csv');
        res.status(200).send(csv);
      });
    });
    

    【讨论】:

    • 嗨 - 我试过了 - 它没有发送任何错误,但它没有显示在我的下载文件夹中..
    • 但它确实在我的控制台网络选项卡中显示为 304
    • hm 奇怪,如果你尝试发送一些字符串而不是 json.csv,只是为了测试呢?
    • @Kiechlus 的回复是正确的,但它使用了过时的 json2csv 版本。采用时看看npmjs.com/package/json2csv#migrating-from-3x-to-4x
    【解决方案3】:

    express 服务器上:

    const json2csv = require('json2csv').parse;
    
    const csvString = json2csv(yourDataAsArrayOfObjects);
    res.setHeader('Content-disposition', 'attachment; filename=shifts-report.csv');
    res.set('Content-Type', 'text/csv');
    res.status(200).send(csvString);
    

    在客户端(否则大多数浏览器不会下载文件,即使您会在网络面板中看到正确的响应):

    window.open(downloadUrl);
    

    【讨论】:

    • 赞成这个答案,因为即使我已经达到了所有数据实际上都在那里的地步,浏览器也不会将其作为文件下载。 “window.open”是客户端缺少的部分!
    • 感谢您的提示:我确实发现在 Mac/PC 上似乎都可以正常工作。只需使用带有“a”的普通哈巴狗文件。 2020.
    猜你喜欢
    • 2021-09-09
    • 2019-10-22
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2018-03-06
    相关资源
    最近更新 更多