2016-04-13 10 views
1

Ich möchte alle Dateien in der Datenbank als zip-Datei herunterladen.Erstellen Sie mehrere Dateien dynamisch nodejs

Wenn ich nur Element herunterladen möchte, kann ich einfach seinen Header und Inhaltstyp festlegen und kann dann seinen Puffer senden.

db.collection("resource").find({}).toArray(function(err, result) { 
res.setHeader('Content-disposition', 'attachment; filename=' + result[0].name); 
res.contentType(result[0].mimetype); 
res.send(result[0].data.buffer); 
} 

Jetzt möchte ich einen Ordner erstellen und das jedes result Element in diesem Ordner dann schicken Sie es hinzufügen.

Der folgende Code gibt nur die erste Datei zurück. Es ist rational, weil ich sofort den Puffer sende.

for(var i=0; i < result.length; i++){ 
    res.setHeader('Content-disposition', 'attachment; filename=' + result[i].name); 
    res.send(result[i].data.buffer); 
} 

Ich denke über sie in ein Array hinzuzufügen.

for(var i=0; i < result.length; i++){ 
    var obj = {name: result[i].name, buffer: result[i].data.buffer}; 
    files.push(obj); 
} 


res.setHeader('Content-disposition', 'attachment; filename=' + "resource"); 
res.contentType('application/zip'); 
res.send(files); 

Dies ergab mir eine Textdatei resource die name und buffer als JSON-Format enthält.

Auch wenn ich den contentType als Anwendung/zip aktualisieren, wird es als Textformat zurückgegeben.

Wie kann ich diese Dateien erstellen, in einen Ordner hinzufügen und den Ordnertyp als zip festlegen?

Antwort

1

Der folgende Ausschnitt ist ein vereinfachtes verwenden Version eines Codes, der für mich funktioniert. Ich musste meine Wrapper entfernen, so dass es leichter zu verstehen ist, so dass dies zu etwas Buggy führen kann.

function bundleFilesToZip(fileUrls, next) { 
     // step 1) use node's fs library to copy the files u want 
     //   to massively download into a new folder 


     //@TODO: HERE create a directory 
     // out of your fileUrls array at location: folderUri 

     // step 2) use the tarfs npm module to create a zip file out of that folder 

     var zipUri = folderUri+'.zip'; 
     var stream = tarfs.pack(folderUri).pipe(fs.createWriteStream(zipUri)); 
     stream.on('finish', function() { 
     next(null, zipUri); 
     }); 
     stream.on('error', function (err) { 
     next(err); 
     }); 
    } 

    // step 3) call the function u created with the files u wish to be downloaded 

    bundleFilesToZip(['file/uri/1', 'file/uri/2'], function(err, zipUri) { 
    res.setHeader('Content-disposition', 'attachment; filename=moustokoulouro'); 
    // step 4) pipe a read stream from that zip to the response with 
    //   node's fs library 
    fs.createReadStream(zipUri).pipe(res); 

    }); 
Verwandte Themen