2012-03-23 68 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