2014-04-25 27 views
6

İstemci için MongoDB (GridFS) dosyasından istemciye istek göndermek üzere istek sahibim var, ancak içerik bellekte olduğu için data değişkenini kullanıyor. Bunu akış modunda yapmalı ve dosyaları müşteriye göndermem gerek. Yanıt için pipe arabelleği nasıl yeniden düzenleyemiyorum. İkinci koda bak - işe yaramıyor, ama ihtiyacım olan şeyleri göster.Express'te istemciye akış arabelleği

Belki de yararlıdır: GridFS'deki veriler Base64 kodludur, ancak akış daha verimli olabilirse değiştirilebilir.

In-Memory versiyonu

router.get('/get/:id', function(req,res){ 
    getById(req.params.id, function(err, fileId){ 
    new GridStore(db, fileId, "r").open(function(err, gridStore) { 
     res.set('Content-Type', gridStore.contentType); 

     var stream = gridStore.stream(true); 
     var data = ''; 
     stream.on("data", function(chunk) { 
      data += chunk; 
     }); 
     stream.on("end", function() {     
      res.send(new Buffer(data, 'base64'));     
     }); 
    }); 
    }); 
}); 

Akış modu sürümü

router.get('/get/:id', function(req,res){ 
    getById(req.params.id, function(err, fileId){ 
    new GridStore(db, fileId, "r").open(function(err, gridStore) { 
     res.set('Content-Type', gridStore.contentType); 

     var stream = gridStore.stream(true); 
     stream.on("data", function(chunk) { 
      new Buffer(chunk, 'base64').pipe(res); 
     }); 
     stream.on("end", function() {     
      res.end(); 
     }); 
    }); 
    }); 
}); 

Güncelleme

ben bu sorunu çözmek için yakın olduğumu düşünüyorum. Umarım bu işe buldum ama Base64 gelen does't kod çözme:

new GridStore(db, fileId, "r").open(function(err, gridStore) { 
    res.set('Content-Type', gridStore.contentType); 
    gridStore.stream(true).pipe(res); 
}); 
+0

marioosh benim cevap bakmak yaptı? – malix

cevap

0
stream.on("data", function(chunk) { 
    res.send(chunk.toString('utf8')); 
}); 
1

ben bir çözüm buldum, ama bu daha iyi olabilir düşünüyorum. Base64 akışını çözmek için base64-stream modülünü kullanıyorum. Aşağıdaki Çözüm:

router.get('/get/:id', function(req,res){ 
    getById(req.params.id, function(err, fileId){ 
     new GridStore(db, fileId, "r").open(function(err, gridStore) { 
      res.set('Content-Type', gridStore.contentType); 
      gridStore.stream(true).pipe(base64.decode()).pipe(res); 
     }); 
    }); 
}); 
1
exports.sendFile = function(db, res, fileId) { 
    var grid = require('gridfs-stream'); 
    var gfs = grid(db, mongoose.mongo); 
    var on_error = function(){ 
    res.status(404).end(); 
    }; 
    var readstream = gfs.createReadStream({ 
    filename: fileId, 
    root: 'r' 
    }); 
    readstream.on('error', function(err) { 
    if (('\'' + err + '\'') === '\'Error: does not exist\'') { 
     return on_error && on_error(err); 
    } 
    throw err; 
    }); 
    return readstream.pipe(res); 
} 
İlgili konular