2016-04-13 15 views
1

Tüm dosyaları veritabanında zip dosyası olarak yüklemek istiyorum.Birden çok dosya oluşturun dinamik olarak nodejs

Yalnızca öğeyi indirmek istiyorsam, üstbilgisini ve içerik türünü kolayca ayarlayabilir ve ardından arabelleğini gönderebilirim.

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

Şimdi bir klasör oluşturun ve gönderin bu klasöre her result eleman eklemek istiyorum.

Aşağıdaki kod sadece ilk dosyayı döndürür. Rasyonel çünkü arabayı hemen gönderdim.

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

Bunları bir diziye eklemeyi düşünüyorum.

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

Bu

Bana bir metin dosyası name ve JSON biçimi olarak buffer içermektedir resource döndü.

contentType'ı uygulama/zip olarak güncelleştirsem bile metin fomat olarak döner.

Bu dosyaları nasıl oluşturabilir, bir klasöre ekleyebilir ve klasör türünü zip olarak ayarlayabilir miyim? Her şeyden

cevap

1

aşağıdaki pasajı basitleştirilmiş olduğunu oluşturmak için adm-zip modülünü kullanabilirsiniz, resmi Ekspres API (http://expressjs.com/en/api.html)

res.attachment([filename]) kullanmalıdır Benim için çalışan bir kodun sürümü. Sargılarımı çıkarmak zorunda kaldım, böylece anlaşılması daha kolay olacaktı, bu yüzden bu bir şey olmaya başladı.

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

    }); 
İlgili konular