2012-03-23 54 views
8

我有一個使用GridFS存儲在Mongo中的小.png文件。我想使用Node + Express + Jade在我的Web瀏覽器中顯示圖像。我可以檢索圖像細膩例如爲:使用Node + Jade + Express存儲在Mongo(GridFS)中的渲染圖像

FileRepository.prototype.getFile = function(callback,id) { 
this.gs = new GridStore(this.db,id, 'r'); 
this.gs.open(callback); 
}; 

,但我不知道如何使用玉視圖引擎渲染。在文檔中似乎沒有任何 信息。

任何人都可以指向正確的方向嗎?

謝謝!

回答

16

我想通了(謝謝蒂莫西!)。問題是我對所有這些技術的理解以及它們如何組合在一起。對於任何有興趣使用Node,Express和Jade顯示來自MongoDB GridFS的圖像的人...

我在MongoDB中的文檔中引用了存儲在GridFS中的圖像,該圖像是存儲爲 字符串的ObjectId。例如MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} < - NB:ObjectId的字符串表示形式。我將它存儲爲字符串的原因是因爲存儲ObjectId在Routing中給我一個痛苦 ,因爲它以二進制形式呈現,我無法弄清楚如何解決這個問題。 (也許有人可以幫忙嗎?)。總之,該解決方案我有低於:

FileRepository文件 - 檢索GridFS的形象,我傳遞一個字符串ID,然後我轉換爲 一個BSON的ObjectId(你也可以通過文件名的文件) :

FileRepository.prototype.getFile = function(callback,id) { 
    var gs = new GridStore(this.db,new ObjectID(id), 'r'); 
    gs.open(function(err,gs){ 
     gs.read(callback); 
    }); 
}; 

玉模板 - 渲染HTML標記:

img(src='/data/#{myentity.ImageId}') 

App.JS文件 - 路由(使用快遞)我設置了 '/數據/:imgtag' 路線的動態圖像:

app.get('/data/:imgtag', function(req, res) { 
    fileRepository.getFile(function(error,data) { 
    res.writeHead('200', {'Content-Type': 'image/png'}); 
    res.end(data,'binary'); 
    }, req.params.imgtag); 
}); 

,但這並工作。任何問題都讓我知道:)

8

我對你在這裏要做的事情感到有點困惑,因爲Jade是用於文本輸出(比如HTML)的標識語言,而不是二進制內容。

由於您使用的玉,你可能有這樣的事情:

app.get/'images/:imgtag', function(req, res) { 
    res.render('image', {imgtag: req.params.imgtag); 
}); 

那麼試試這個:

app.get/'images/:imgtag', function(req, res) { 
    filerep.getFile(function(imgdata) { 
     res.header({'Content_type': 'image/jpeg'}) 
     res.end(imgdata); 
    }, req.params.imgtag); 
}); 

,將發送原始文件作爲與HTTP請求的響應正確的MIME類型。如果你想用Jade來傳遞一個模板(比如圖像彈出框),你可以使用不同的彈出路徑,或者甚至使用一個數據:uri並在頁面中編碼圖像數據。

+0

修復MIME類型或從網格中檢測到它 – 2012-03-23 21:14:53

+0

謝謝蒂莫西,這指出我在正確的方向。還有一個我需要解決的其他問題,所以我在下面發佈我的解決方案以獲得完整性。 – 2012-03-24 03:31:16