2017-07-02 2 views
0

Ich bin neu in NodeJS. Ich weiß, dass wir Daten mit der Methode pipe() zum Client streamen können. HierWie man einen WriteStream verbindet, der eine Erweiterung verkettet?

ist der Ausschnitt aus dem Code

router.get('/archive/*', function (req, res) { 

     var decodedURI = decodeURI(req.url); 
     var dirarr = decodedURI.split('/'); 
     var dirpath = path.join(dir, dirarr.slice(2).join("/")); 
     console.log("dirpath: " + dirpath); 
     var archive = archiver('zip', { 
      zlib: {level: 9} // Sets the compression level. 
     }); 
     archive.directory(dirpath, 'new-subdir'); 
     archive.on('error', function (err) { 
      throw err; 
     }); 
     archive.pipe(res) 
     archive.on('finish', function() { 
      console.log("finished zipping"); 
     }); 
     archive.finalize(); 

    }); 

, wenn ich einen Erhaltungs-Anforderungs die ZIP-Datei heruntergeladen verwenden, aber ohne Verlängerung. Ich weiß es, weil ich einen Writestream in die Antwort einfließen lasse. Gibt es da eh eine Pipe mit einer .zip-Erweiterung? Oder Wie kann ich die Zip-Datei senden, ohne die Zip-Datei auf der Festplatte zu erstellen?

Antwort

1

Eine der Möglichkeiten ist Headers vor Rohrleitungen zu ändern,

res.setHeader("Content-Type", "application/zip"); 
res.setHeader('Content-disposition' ,'attachment; filename=downlaod.zip'); 

Für der vorgegebene Code,

router.get('/archive/*', function (req, res) { 
     var decodedURI = decodeURI(req.url); 
     var dirarr = decodedURI.split('/'); 
     var dirpath = path.join(dir, dirarr.slice(2).join("/")); 
     var output = fs.createWriteStream(__dirname + '/7.zip'); 
     var archive = archiver('zip', { 
      zlib: {level: 9} // Sets the compression level. 
     }); 
     archive.directory(dirpath, 'new-subdir'); 
     archive.on('error', function (err) { 
      throw err; 
     }); 
     res.setHeader("Content-Type", "application/zip"); 
     res.setHeader('Content-disposition' ,'attachment; filename=downlaod.zip'); 
     archive.pipe(res); 
     archive.finalize(); 

    }); 
1

Sie res.attachment() auf beide verwenden stellen Sie den Dateinamen des Abrufs, und auch seine Mime-Typ:

router.get('/archive/*', function (req, res) { 
    res.attachment('archive.zip'); 
    ... 
}); 
+0

aber ich möchte nicht die Zip-Datei in HDD erstellen. Ich möchte nur das Ergebnis aus dem Archiver-Modul als Antwort pipe –

+0

Bitte lesen Sie die Dokumentation, die ich verlinkte sorgfältig: all diese 'res.attachment' setzt HTTP-Header. – robertklep

+0

Ok, ich habe es. Bevor Sie den Anhang senden, ändern Sie seinen Inhaltstyp und die Inhaltsdisposition richtig? –

Verwandte Themen