2013-02-19 14 views
12

Ci scusiamo in anticipo, ho un paio di domande su createReadStream() qui.createReadStream(). Pipe() Callback

Fondamentalmente quello che sto facendo è creare dinamicamente un file e trasmetterlo all'utente usando fs una volta finito. Sto usando .pipe() per assicurarmi che io stia girando correttamente (smetti di leggere se il buffer è pieno, ricomincia da capo una volta che non lo è, ecc.) Ecco un esempio del mio codice che ho finora.

http.createServer(function(req, res) { 
    var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024}) 

    stream.pipe(res); 

}).listen(3002, function() { 
    console.log('Server listening on port 3002') 
}) 

che ho letto in un'altra domanda StackOverflow (mi dispiace, persa) che se si sta utilizzando il res.send regolare() e res.end() che .pipe() grandi opere, in quanto chiama il .send e .end e aggiunge il throttling.

Che funziona bene per la maggior parte dei casi, tranne che sto volendo rimuovere il file una volta che lo stream è completo e non usando .pipe() significa che dovrò gestire il throttling me stesso solo per ottenere una richiamata.

Quindi immagino che mi piacerebbe creare il mio oggetto "res" falso che ha un metodo .send() e .end() che fa quello che solitamente fa res, comunque su .end () Inserirò il codice aggiuntivo per ripulire il file generato. La mia domanda è fondamentalmente come potrei farlo?

L'aiuto con questo sarebbe molto apprezzato, grazie!

+0

possibile duplicato di [Scarica file dal server NodeJS] (http://stackoverflow.com/questions/7288814/download-file-from-nodejs-server) – loganfsmyth

+0

Che effettivamente risponda alla domanda di download del mio file, grazie! Aggiornerò la domanda per riflettere solo la domanda .pipe(). –

risposta

25

La prima parte sul download può essere risolta con Download file from NodeJS Server.

Per quanto riguarda la rimozione del file dopo che è stato inviato, è possibile aggiungere il proprio gestore di eventi per rimuovere il file una volta che tutto è stato inviato.

var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024}) 
stream.pipe(res); 

var had_error = false; 
stream.on('error', function(err){ 
    had_error = true; 
}); 
stream.on('close', function(){ 
    if (!had_error) fs.unlink('<filepath>/example.pdf'); 
}); 

Il gestore error non è al 100% necessario, ma poi non si elimina il file se c'è stato un errore mentre si stava tentando di inviarlo.

+0

Ahh, geniale! Non sapevo che potresti aggiungere eventi quando condividi i flussi. Supponevo che si potesse avere un solo gestore di eventi per evento e che sarebbe stato consumato dalla chiamata a pipe(). Grazie! –