Nodejs envoie un fichier en réponse


113

Le framework Expressjs a une méthode sendfile (). Comment puis-je faire cela sans utiliser tout un cadre. J'utilise node-native-zip pour créer une archive et je veux l'envoyer à l'utilisateur.

Réponses:


183

Voici un exemple de programme qui enverra myfile.mp3 en le diffusant à partir du disque (c'est-à-dire qu'il ne lit pas le fichier entier en mémoire avant d'envoyer le fichier). Le serveur écoute sur le port 2000.

[Mise à jour] Comme mentionné par @Aftershock dans les commentaires, a util.pumpdisparu et a été remplacé par une méthode sur le prototype Stream appelée pipe; le code ci-dessous reflète cela.

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

Tiré de http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/


1
Mais je ne diffuse pas un fichier depuis le serveur, je crée l'archive
— andrei

Par "flux", je veux dire "envoyer les données du fichier à la connexion au fur et à mesure de sa lecture" par opposition à "lire le fichier entier en mémoire puis envoyer toutes ces données à la connexion en même temps" (ce qui est l'approche naïve typique). Je ne veux pas dire "diffuser les données de la mémoire sans qu'elles soient transférées sur le disque". Le message auquel j'ai lié explique plus en détail.
— Michelle Tilley

6
util.pump (readStream, réponse); est déprécié ... use readStream.pipe (response);
— Aftershock


@Abdul Je ne suis pas sûr de comprendre votre question; tu veux me tirer un e - mail ?
— Michelle Tilley

13

Vous devez utiliser Stream pour envoyer un fichier (archive) dans une réponse, de plus, vous devez utiliser le type de contenu approprié dans votre en-tête de réponse.

Il existe un exemple de fonction qui le fait:

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

Le but du champ Content-Type est de décrire suffisamment complètement les données contenues dans le corps pour que l'agent utilisateur récepteur puisse choisir un agent ou un mécanisme approprié pour présenter les données à l'utilisateur, ou traiter les données d'une manière appropriée.

"application / octet-stream" est défini comme "données binaires arbitraires" dans la RFC 2046, le but de ce type de contenu est d'être enregistré sur le disque - c'est ce dont vous avez vraiment besoin.

"filename = [nom du fichier]" spécifie le nom du fichier qui sera téléchargé.

Pour plus d'informations, consultez cette rubrique stackoverflow .


comment la demande d'appel côté client donne le code côté client
— ashwini

1
veuillez noter que la fonction «existe» est obsolète.
— Ievgen Naida
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.