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);
});
marioosh nie patrzysz na moją odpowiedź? – malix