2012-07-19 9 views
5

私はMongodbが2つの方法で画像を保存できることを理解しています。定期的な文書でMongodbの画像をNodejsで保存する

  1. 大きな画像を管理するためGridfs介し
  2. バイナリとして画像を記憶することによって。簡単にするために

と私は、サーバーに予定した画像が小さいので、私はnodejsを使用していますブラウザにイメージを提供するにはオプション1

のために行くだろう。

私の質問はこれがいかに難しいでしょうか?バイナリデータをブラウザが理解する実際のイメージに変換するにはどうすればよいですか?どのようなタイプのエンコーディングが関係していますか?

ウェブ上のチュートリアル/例を教えてください。

これはパフォーマンス上の理由から、これが良いアイデアではないことが分かっているので、一度配信した画像をキャッシュする予定です。私はちょうどすべてのファイルシステムを避けたいです。

答えて

5

私は、MongoDBの画像を提供することを強くお勧めします。

静的filestore(S3)に保存し、MongoDBのパスを保持する方がよいでしょう。


おそらく、MongoDBのにファイルを配置するbase64エンコーディングを使用します。http://www.greywyvern.com/code/php/binary2base64/(または単にbase64でシェル・ユーティリティー)。

通常のドキュメントを使用している場合、パフォーマンスのコストは比較的低くなります(キャッシュが良好である限り)。 GridFSと通常の文書を混在させたデータベースを使用している場合、サーバー上に多くのRAMが必要になります - GridFSクエリはドキュメントクエリとはまったく異なった形で実行されます。

画像を変換すると、次のように働くかもしれない:

var base64Data = imagefile.replace(/^data:image\/png;base64,/,""), 
var dataBuffer = new Buffer(base64Data, 'base64'); 

// below line won't actually work but it's something along the lines of what you want: 

db.foo.insert({magic: 123, etc... img: dataBuffer.toString()}) 
+0

これは非常に役に立ちます。今私は画像をどのように保存するか考えています。私はあなたの答えを拡大して、私がどのように画像を提供するかを含めることができますか? – jamjam

+0

私はそれがあなたがそれらをどのように質問したかに依存するでしょうか? 'var c = db.foo.find({imgname:" something "}; console.log(c.img)' これはあなたのサーバーなので...私はあなたにサービスを提供する方法を完全にはわかりません - ノードを使用していると仮定しますか? – ranman

+0

クエリは問題ではなく、データを取得できます。しかし、このバイナリデータをWebブラウザで通常のイメージとしてレンダリングするにはどうすればよいですか? – jamjam

2

あなたのWebブラウザは、コンテンツをレンダリング持ってやらなければならないことは、正しいヘッダとレスポンスボディを送っています。

PNGイメージをレンダリングしようとすると、mimetypeはimage/pngになり、レスポンス本文にイメージファイルのバイトを追加します。

ブラウザは、このレスポンスをPNGタイプのイメージとして解釈し、適切にレンダリングします。

関連する問題