2017-04-19 2 views
1

私はMongoDBコレクションに小さなサムネイルを保存しています。私は.findOne()でそれらを抽出することができますが、私はそれらをExpressJSルートを介して正しく戻すことはできません。NodejでMongodbに保存されている画像を取得する

私はheroku環境が永続ストレージを保証しないため、親指をディスクに保存していません。 GridFSを使用していないのは、親指が< 16MBなのでです。このようにオブジェクトを返しますconsole.log

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

nodejs:

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

は、私はこのようなExpressjsルート上imgを提供することができます:コレクションにAA新しい文書を挿入

はこのような何かを行きます、

{ _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 ... > } 
    } 

しかし、ブラウザの短所OLEは私にこのようなエラーを与える:

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

enter image description here

は私が間違ってunencodingのですか? resヘッダーを間違って設定していますか?

私が間違っていることを誰かに見せてもらえますか?

+0

'res.send(results.img);の代わりに' res.send(results.img.buffer); 'を試してください。 –

+0

私はちょうどこれを試してみましたが、残念なことに(と少し驚いたことに)、違いはありませんでした。別のエラーでもありません。 – Colin

+0

'curl localhost:3000/picturewall/...'を実行し、ブラウザのスクリーンショットではなくコンソールからの応答を貼り付けることもできますか? –

答えて

1

データベースにbase64イメージを保存するようです。

img: Buffer(encImg)のようにします。 node.jsのデフォルトのバッファエンコーディングはutf8なので、イメージはMongoDBのバイナリタイプのbase64 utf8文字列としてdbに保存されます!あなたがあなたの代わりにbase64文字列のバイナリデータをお送りしますres.send(results.img.buffer);としてクライアントに応答を送信するとき

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

その方法:あなたがあなたの画像を保存するとき

適切な方法は、バッファのエンコーディングを指定することになります。

+0

Vladありがとうございました。私と一緒にこれを見る時間をとっていただきありがとうございます。 – Colin

+0

あなたは大歓迎です、Colin。 –

関連する問題