2015-05-04 1 views
0

Я сохраняю изображения из своего углового приложения в MongoDB с использованием GridFs. Но я не могу понять, как получить изображения из БД в приложение?
Я использую пользовательский objectId для запроса.GET изображения от GridFs до Angular

EDIT
Похоже ГЭТ часть теперь работает, но тогда не было средств массовой информации в коллекции. Я немного поиграл с кодом, и теперь я могу видеть fs.chunks и fs.files в базе данных. Я думаю, проблема в том, что я пытаюсь запросить метаданные в запросе GET. Это не возвращает никаких данных ответа. Кто-нибудь понял, как это исправить?

var fs = require('fs'); 
var conn = mongoose.connection; 
var Grid = require ('gridfs-stream'); 
Grid.mongo = mongoose.mongo; 
var gfs = Grid (conn.db); 
var buffer = ""; 


app.post('/uploads/', multer({ 
    upload: null, 
    onFileUploadStart: function (file, req){ 
     this.upload = gfs.createWriteStream({ 
      filename: file.originalname, 
      metadata:{"objectId" : req.body.project_id}, 
      mode: "w", 
      chunkSize: 1024*4, 
      content_type: file.mimetype, 
      root: "fs", 
     }); 
    }, 

    onFileUploadData: function(file, data) { 
     this.upload.write(data); 
    }, 
    onFileUploadComplete: function(file, res) { 
     done=true; 
    } 
}), function(req, res){ 
    res.status(200); 
    res.send("Success!"); 
}); 
app.route('/uploads/media/:projectId').get(function (req, res){ 
    var readstream = gfs.createReadStream({ 
     "metadata.objectId" : req.params.projectId 
    }); 
    res.set('Content-Type', 'image/jpeg'); 
    readstream.pipe(res); 
}); 
+0

Что результат app.get ('/ добавления /: ObjectId –

+0

„содержимое файла“ появляется пустой, статус получить запрос на объект „(в ожидании)“ – Wandkleister

ответ

0

Вам необходимо написать поток обратно к ответу. Here is another similar question. Но в основном вам нужно либо передать поток в ответ, либо использовать конечное событие потока, и записать результат в ответ. Следующие коды кода отвечают на запрос и задают тип содержимого изображения/jpeg.

app.get('/uploads/:objectId', function(req, res){ 

    var options = { 
     _id : req.params.objectId 
    }; 

    gfs.exist(options, function(err, exists) { 
     if(!exists) { 
      res.status(404); 
      res.end(); 
     } else { 
      var readstream = gfs.createReadStream(options); 

      res.set('Content-Type', 'image/jpeg'); 

      readstream.pipe(res); 
     } 
    }); 
}); 
+0

параметр может быть определенно совпадает с objectId в моей записи метаданных fs.files. Возможно, проблема в том, что я не запрашиваю объект ObjectId по умолчанию для GridFS. Это параметр в метаданных – Wandkleister

+0

Хорошо, я внедрил код, немного отличающийся от вас, потому что это казалось он не работал должным образом. Теперь я получаю 404 – Wandkleister

+0

Отредактировал свой первый пост для вас ... пытается работать над запросом POST – Wandkleister

0
 var pi_id = fields.pic_id; 
     gfs.findOne({ _id: pi_id }, function (err, file) { 
        console.log(file); 
        if (err) return res.status(400).send(err); 
        if (!file) return res.status(404).send(''); 

        res.set('Content-Type', file.contentType); 
        res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"'); 

        var readstream = gfs.createReadStream({ 
         _id: file._id 
        }); 

        readstream.on("error", function(err) { 
         console.log("Got error while processing stream " + err.message); 
         res.end(); 
        }); 

        readstream.pipe(res); 

        console.log(readstream.pipe(res)) 
        });