Antworten:
Hier ist ein Beispielprogramm, das myfile.mp3 durch Streaming von der Festplatte sendet (dh es liest nicht die gesamte Datei in den Speicher, bevor die Datei gesendet wird). Der Server überwacht Port 2000.
[Update] Wie von @Aftershock in den Kommentaren erwähnt, util.pumpist es weg und wurde durch eine Methode für den Stream-Prototyp ersetzt, die aufgerufen wird pipe. Der folgende Code spiegelt dies wider.
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);
Entnommen aus http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/
Sie müssen Stream verwenden, um eine Datei (Archiv) in einer Antwort zu senden. Außerdem müssen Sie den entsprechenden Inhaltstyp in Ihrem Antwortheader verwenden.
Es gibt eine Beispielfunktion, die dies tut:
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");
}
});
}
}
Der Zweck des Felds "Inhaltstyp" besteht darin, die im Hauptteil enthaltenen Daten so vollständig zu beschreiben, dass der empfangende Benutzeragent einen geeigneten Agenten oder Mechanismus auswählen kann, um die Daten dem Benutzer zu präsentieren, oder auf andere Weise auf geeignete Weise mit den Daten umgehen kann.
"application / octet-stream" ist in RFC 2046 als "beliebige Binärdaten" definiert. Der Zweck dieses Inhaltstyps besteht darin, auf der Festplatte gespeichert zu werden - genau das, was Sie wirklich brauchen.
"Dateiname = [Name der Datei]" gibt den Namen der Datei an, die heruntergeladen werden soll.
Weitere Informationen finden Sie in diesem Thema zum Stapelüberlauf .