2012-07-19 37 views
5

我知道Mongodb可以以兩種方式存儲圖像。在Mongodb中存儲圖像爲Nodejs提供服務

    在常規文檔
  1. 通過經由GridFS的圖像作爲二進制
  2. 存儲用於管理較大的圖像。

爲了簡化和因爲我打算服務器的圖像小,我會去選擇1

要服務於圖像我使用一個的NodeJS瀏覽器。

我的問題是這會有多困難?如何將二進制數據轉換爲瀏覽器可以理解的實際圖像?涉及什麼類型的編碼?

你能指點我在網絡上其他地方的教程/例子嗎?

順便說一句,我知道這可能不是好主意,因爲性能的原因,我計劃緩存一次服務的圖像。我只想避免整個文件系統。

回答

5

我強烈建議不要從MongoDB提供圖片。

將它們存儲在一個靜態文件存儲(S3)上,並在MongoDB中保留路徑會更好。


你可能會使用base64編碼把文件分成的MongoDB:http://www.greywyvern.com/code/php/binary2base64/(或只是BASE64 shell實用程序)。

如果您只是使用常規文檔,那麼性能成本相對較低(只要緩存很好)。如果您使用的是具有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 2012-07-19 22:01:16

+0

我的意思是這取決於你如何查詢他們? 'var c = db.foo.find({imgname:「something」}; console.log(c.img)' 這是你的服務器所以...我不完全確定如何告訴你服務的東西 - 我假設你正在使用節點? – ranman 2012-07-19 23:15:09

+0

查詢不是問題,我可以獲取數據。但是,如何處理這些二進制數據以使Web瀏覽器將其呈現爲普通圖像? – jamjam 2012-07-19 23:32:24

2

所有你需要做的,讓您的網絡瀏覽器呈現的內容是發送正確的頭和響應主體。

因此,假設您要呈現PNG圖像,您的mimetype將爲image/png,然後將圖像文件字節添加到響應主體。然後

瀏覽器會解釋這種反應爲類型PNG的圖片,並使其適當

相關問題