Il framework Expressjs ha un metodo sendfile(). Come posso farlo senza usare un intero framework. Sto usando node-native-zip per creare un archivio e voglio inviarlo all'utente.Nodejs invia file in risposta
risposta
Ecco un programma di esempio che invierà myfile.mp3 eseguendolo in streaming dal disco (ovvero, non legge l'intero file in memoria prima di inviare il file). Il server in ascolto sulla porta 2000.
[Update] Come indicato da @Aftershock nei commenti, util.pump
è andato ed è stato sostituito con un metodo sul prototipo torrente pipe
; il codice qui sotto riflette questo.
var http = require('http'),
fileSystem = require('fs'),
path = require('path');
http.createServer(function(request, response) {
var filePath = path.join(__dirname, 'myfile.mp3');
var stat = fileSystem.statSync(filePath);
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': stat.size
});
var readStream = fileSystem.createReadStream(filePath);
// We replaced all the event handlers with a simple call to readStream.pipe()
readStream.pipe(response);
})
.listen(2000);
Tratto da http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/
È necessario utilizzare Stream per inviare il file (filmati) in una risposta, ciò che è più devi usare appropriata Content-type nella vostra intestazione di risposta.
C'è una funzione di esempio che farlo:
const fs = require('fs');
// Where fileName is name of the file and response is Node.js Reponse.
responseFile = (fileName, response) => {
const filePath = "/path/to/archive.rar" // or any file format
// Check if file specified by the filePath exists
fs.exists(filePath, function(exists){
if (exists) {
// Content-type is very interesting part that guarantee that
// Web browser will handle response in an appropriate manner.
response.writeHead(200, {
"Content-Type": "application/octet-stream",
"Content-Disposition": "attachment; filename=" + fileName
});
fs.createReadStream(filePath).pipe(response);
} else {
response.writeHead(400, {"Content-Type": "text/plain"});
response.end("ERROR File does not exist");
}
});
}
}
Lo scopo del campo Content-Type è quello di descrivere i dati contenuti nel corpo abbastanza pienamente che l'agente utente ricevente può scegliere un adeguato agente o meccanismo per presentare i dati all'utente o altrimenti trattare i dati in modo appropriato.
"application/octet-stream" è definito come "dati binari arbitrari" in RFC 2046, scopo di questo tipo di contenuto deve essere salvato su disco - è ciò che è realmente necessario.
"nomefile = [nome del file]" specifica il nome del file che verrà scaricato.
Per ulteriori informazioni, vedere this stackoverflow topic.
- 1. Nodejs invia risposta parziale
- 2. Nodejs invia dati in gzip usando zlib
- 3. Invia risposta alla conversazione Facebook
- 4. Node Express che invia file di immagini come risposta API
- 5. Nodejs File Permissions
- 6. Codeigniter PHP JSON invia risposta HTML
- 7. percorso file ed elimina file in nodejs
- 8. rotaie redirect_to formato html invia la risposta in js
- 9. Invia file + parametri in post richiesta
- 10. Statistiche file NodeJS
- 11. Nodejs - Verifica file nascosti
- 12. NodeJS writeStream file vuoto
- 13. nodejs caricamento file
- 14. risposta di flusso dalla richiesta nodejs a s3
- 15. Invia file tramite PSSession
- 16. spostare il file in ExpressJS/NodeJS
- 17. Nodejs scrive json in un file
- 18. Come convogliare la risposta a un file nel modulo Co-Request e NodeJs?
- 19. swift, invia file al server
- 20. nodejs biblioteca richiesta, ottenere il tempo di risposta
- 21. Come collegare un file (NodeJS)
- 22. Riorientare stdout su file nodejs
- 23. Mocha + Nodejs + Heroku .env file
- 24. NodeJS scrivere base64 file immagine
- 25. Invia una risposta HTTP Chunked da un server Go
- 26. Express.js - Invia un avviso come risposta rimanendo sulla stessa pagina
- 27. Invia richiesta HTTP e ricevi risposta HTTP utilizzando javascript
- 28. Come impostare Content-Length quando si invia la richiesta POST in NodeJS?
- 29. Invia dati e recupera la risposta utilizzando PHP Curl?
- 30. invia un file al client
Ma non sto trasmettendo un file dal server, creo l'archivio – andrei
Per "flusso" intendo "inviare i dati del file alla connessione mentre viene letto" invece di "leggere l'intero file in memoria quindi invia tutti i dati alla connessione contemporaneamente "(che è il tipico approccio ingenuo). Non intendo dire "trasmetti i dati dalla memoria senza andare sul disco". Il post che ho collegato spiega in maggior dettaglio. –
ok ora capisco, grazie. inizierò da lì – andrei