2014-04-25 10 views
6

Mam moduł obsługi żądań, aby wysłać plik z MongoDB (GridFS) do klienta, tak jak poniżej, ale używa on zmiennej data, aby zawartość była w pamięci. Muszę to zrobić w trybie strumieniowym i wysłać plik w porcjach do klienta. Nie mogę się zgodzić na to, jak reagować na bufory pipe. Popatrz na drugi kod - nie działa, ale pokaż coś, czego potrzebuję.Bufor do przesyłania strumieniowego do klienta w Express

Być może jest to przydatne: dane w GridFS są zakodowane w Base64, ale można je zmienić, jeśli przesyłanie strumieniowe może być bardziej wydajne.

w pamięci wersja

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

Streaming wersja tryb

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

Aktualizacja

myślę, że jestem blisko rozwiązać ten problem. Znalazłem to działa, ale nie podlega dekodowania od Base64:

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

marioosh nie patrzysz na moją odpowiedź? – malix

Odpowiedz

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

Znalazłem rozwiązanie, ale myślę, że może być lepiej. Używam modułu base64-stream do dekodowania strumienia Base64. Rozwiązanie poniżej:

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); 
} 
Powiązane problemy