Nodejs senden eine Datei als Antwort


113

Das Expressjs-Framework verfügt über eine sendfile () -Methode. Wie kann ich das tun, ohne ein ganzes Framework zu verwenden? Ich verwende Node-Native-Zip, um ein Archiv zu erstellen, und ich möchte das an den Benutzer senden.

Antworten:


182

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/


1
Aber ich streame keine Datei vom Server, ich erstelle das Archiv
andrei

Mit "Stream" meine ich "Senden Sie die Dateidaten an die Verbindung, während sie gelesen werden" im Gegensatz zu "Lesen Sie die gesamte Datei im Speicher und senden Sie dann alle diese Daten auf einmal an die Verbindung" (was der typische naive Ansatz ist). Ich meine nicht "Streaming der Daten aus dem Speicher, ohne dass sie auf die Festplatte gehen". Der Beitrag, auf den ich verlinkt habe, wird ausführlicher erklärt.
Michelle Tilley

6
util.pump (readStream, Antwort); wird abgeschrieben ... benutze readStream.pipe (Antwort);
Nachbeben


@Abdul Ich bin mir nicht sicher, ob ich deine Frage verstehe. Willst du mir eine E-Mail schreiben ?
Michelle Tilley

13

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 .



1
Bitte beachten Sie, dass die Funktion 'existiert' veraltet ist.
Ievgen Naida
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.