2012-10-25 14 views
7

Recentemente ho iniziato a lavorare con node.js. Mentre sto affrontando un requisito in uno dei miei progetti, sto affrontando un problema in cui dovrei essere in grado di scrivere dinamicamente alcuni dati in un file CSV e lasciarlo richiamare come popup da scaricare per l'utente (con opzioni di salvataggio e annullamento - come normalmente vedere). Dopo aver cercato su Google per un po 'di tempo ho deciso di utilizzare il modulo csv npm https://github.com/wdavidw/node-csv-parser. Sono in grado di scrivere dati in un file e salvarlo utilizzando questo modulo. Voglio richiedere un popup per salvare questo file con/senza salvare il file.Richiedi un file csv da scaricare come pop-up usando node.js e node-csv-parser (modulo nodo)

mio codice simile a questa:

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

Questo è il lavoro buono per quanto riguarda la scrittura del file CSV è interessato.

  • Desidero richiedere immediatamente questo file per il download per gli utenti.
  • Se questo può essere fatto senza salvare il file, sarà fantastico.
  • Come posso impostare content-type e content-disposition come facciamo in PHP

Qualsiasi aiuto è molto apprezzato. -Grazie

risposta

13

ho fatto qualcosa di simile:

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

Solo una nota, una volta completato il codice del server sopra, collegare il proprio lato client location.href all'URL di richiesta del nodo [non è necessario per una chiamata Ajax]. – vinod

+0

Una breve nota sulla sintassi per Express 4: res.setHeader ('Content-disposition', 'attachment; filename = testing.csv'); res.set ('Content-Type', 'text/csv'); res.status (200) .send (csv); –

+0

senza libreria csv, e senza express, invece della riga csv(), puoi fare response.write (myCSVText); resonse.end(); –

0

Scopri questa risposta: Nodejs send file in response

Fondamentalmente, non c'è bisogno di salvare il file sul disco rigido. Invece, prova a inviarlo direttamente allo response. Se stai usando qualcosa come espresso allora sarebbe simile a questa:

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

non sto usando espresso, ma solo un quadro personalizzato del nodo.js –

+0

In entrambi i casi, il modulo 'http' risponde alle richieste con callback con gli stessi parametri,' funzione (richiesta, risposta) '. Penso che dovresti essere in grado di inviare i risultati del CSV direttamente alla 'risposta'. – Max

+0

questo è sbagliato, - dice csv non è una funzione – Prabhas

11

seguente soluzione è per Express

Express evoluto, invece di impostare l'intestazione di tipo di allegato e contenuto, utilizzare direttamente l'allegato api http://expressjs.com/4x/api.html#res.attachment

Nota: attachment() non trasferisce il file, semplicemente imposta il nome del file nell'intestazione.

response.attachment('testing.csv'); 
csv().from(data).to(response); 
+0

Non sto usando Express come ho già menzionato. –

4

Express-CSV è un ottimo modulo per i contenuti di scrittura CSV per lo streaming da un server node.js, che sarà inviato come risposta al client (e scaricati come file). Molto facile da usare.

app.get('/', function(req, res) { 
    res.csv([ 
    ["a", "b", "c"] 
    , ["d", "e", "f"] 
    ]); 
}); 

La documentazione: https://www.npmjs.com/package/express-csv

Quando si passa un oggetto, è necessario anteporre le intestazioni in modo esplicito (se li volete). Ecco il mio il mio esempio usando la risposta di 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); 
      }); 
    }); 
19

Manish Kumar è impeccabile - voleva solo per includere un Express 4 variante sintassi per raggiungere questo obiettivo:

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

} 
Problemi correlati