2017-04-19 8 views
1

Ich habe kleine Thumbnails in einer MongoDB-Sammlung gespeichert. Während ich sie mit einer .findOne() extrahieren kann, kann ich sie über eine ExpressJS-Route nicht korrekt zurückgeben.Abrufen von Bildern in Mongodb mit Nodejs

Ich speichere Thumbs nicht auf der Festplatte, da die Heroku-Umgebung keinen dauerhaften Speicher garantiert. Ich verwende nicht GridFS, da diese < 16MB sind.

aa neues Dokument in die Sammlung einfügen geht ungefähr so:

router.get('/pictures/:picture', function(req, res){ 
    /* my filename is actually a mdb oid */ 
    var filename = req.params.picture; 
    MongoClient.connect(url, function(err, db){ 
     db.collection('myimages') 
     .findOne({'_id': ObjectId(filename)}, function(err, results){ 
      console.log(results); //<-- Output below 
      res.setHeader('content-type', results.contentType); 
      res.send(results.img);  
     }); 
    }); 
    }); 

Die NodeJS console.log wie folgt ein Objekt zurückgibt:

MongoClient.connect(url, function(err, db){ 

     var newImg = fs.readFileSync(req.file.path); 
     var encImg = newImg.toString('base64'); 
     var newItem = { 
       description: req.body.description, 
       date: Date(), 
       contentType: req.file.mimetype, 
       size: req.file.size, 
       img: Buffer(encImg) 
      }; 

      db.collection('myimages') 
       .insert(newItem, function(err, result){ 
        if (err) { console.log(err); } 
       }); 
}); 

ich die img über eine Express.js Strecke wie diese dienen kann ,

{ _id: 58f7ab923b7c842023cf80ec, 
     description: '', 
     date: 'Wed Apr 19 2017 13:25:22 GMT-0500 (CDT)', 
     contentType: 'image/jpeg', 
     size: 648436, 
     img: 
     Binary { 
     _bsontype: 'Binary', 
     sub_type: 0, 
     position: 864584, 
     buffer: <Buffer 2f 39 6a 2f 34 41 41 51 53 6b 5a 4a 52 67 41 42 41 51 41 41 53 41 42 49 41 41 44 2f 34 51 50 38 52 58 68 70 5a 67 41 41 54 55 30 41 4b 67 41 41 41 41 ... > } 
    } 

Aber der Browser Nachteile ole ist mir ein Fehler wie folgt aus:

Resource interpreted as Document but transferred with MIME type image/jpeg: "http://localhost:3000/picturewall/58f7ab923b7c842023cf80ec". 

enter image description here

Bin ich falsch unencoding? Falsche Einstellung res Header?

Kann mir jemand zeigen, was ich falsch mache?

+0

Könnten Sie bitte 'res.send (results.img.buffer);' anstelle von 'res.send (results.img);'? –

+0

Ich habe es gerade versucht und leider (und ein wenig überraschend), es machte keinen Unterschied. Nicht einmal ein anderer Fehler. – Colin

+0

Können Sie auch eine 'curl localhost: 3000/picturewall/...' ausführen und eine Antwort von der Konsole anstelle eines Browser-Screenshots einfügen? –

Antwort

1

So sieht aus wie Sie ein Base64-Image in Ihrer Datenbank speichern.

Sie tun dies wie folgt img: Buffer(encImg). In der Standard-Puffercodierung von node.js ist utf8, so wird Ihr Bild in db als base64 utf8 Zeichenfolge unter Binär-Typ in MongoDB gespeichert!

Eine richtige Art und Weise wird eine Puffer Codierung angeben, wenn Sie Ihr Bild speichern:

// ... 
img: new Buffer(encImg, 'base64') 
// ... 

auf diese Weise, wenn Sie eine Antwort an den Client senden, wie res.send(results.img.buffer); Sie binäre Daten anstelle eines Base64-String senden werde.

+0

Vielen Dank Vlad. Ich schätze es, dass Sie sich die Zeit genommen haben, sich das mit mir anzusehen. – Colin

+0

Gern geschehen, Colin. –