web-dev-qa-db-ja.com

node.jsとnode-csv-parser(ノードモジュール)を使用してポップアップとしてダウンロードするcsvファイルを要求する

最近node.jsを使い始めました。私のプロジェクトの1つで要件を満たしている間、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のようにcontent-typeとcontent-dispositionを設定するにはどうすればよいですか

どんな助けでも大歓迎です。 -ありがとう

13
Manish Kumar

私はそれをこのようなことをしました:

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);
15
Manish Kumar

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

}
33
joel.bowen

次の解決策はExpress用です

Expressは進化し、添付ファイルとコンテンツタイプヘッダーを設定する代わりに、添付ファイルAPIを直接使用 http://expressjs.com/4x/api.html#res.attachment

注:attachment()はファイルを転送せず、ヘッダーにファイル名を設定するだけです。

response.attachment('testing.csv');
csv().from(data).to(response);
12
Palani

Express-csvは、node.jsサーバーからストリーミングするcsvコンテンツを書き込むための優れたモジュールであり、クライアントへの応答として送信されます(ファイルとしてダウンロードされます)。とても使いやすい。

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

この回答を確認してください: Nodejs send file in response

基本的に、ファイルをハードドライブに保存する必要はありません。代わりに、responseに直接送信してみてください。 Expressなどを使用している場合は、次のようになります。

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