Cli*_*ead 8 mongodb node.js gridfs express pug
我使用GridFS在Mongo中存储了一个小的.png文件.我想使用Node + Express + Jade在我的网络浏览器中显示图像.我可以检索图像很好,例如:
FileRepository.prototype.getFile = function(callback,id) {
this.gs = new GridStore(this.db,id, 'r');
this.gs.open(callback);
};
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用Jade View Engine渲染它.文档中似乎没有任何信息.
谁能指出我正确的方向?
谢谢!
Cli*_*ead 16
我想出来了(感谢蒂莫西!).问题在于我对所有这些技术的理解以及它们如何结合在一起.对于任何有兴趣使用Node,Express和Jade显示来自MongoDB GridFS的图像的人...
MongoDB中的My Document引用了存储在GridFS中的Image,它是一个存储为字符串的ObjectId.例如MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} < - NB:ObjectId的字符串表示.我将它存储为字符串的原因是因为存储ObjectId给了我一个痛苦的路由,因为它呈现为二进制,我无法弄清楚如何解决这个问题.(也许有人可以帮忙吗?)无论如何,我的解决方案如下:
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);
});
};
Run Code Online (Sandbox Code Playgroud)
玉模板 - 渲染HTML标记:
img(src='/data/#{myentity.ImageId}')
Run Code Online (Sandbox Code Playgroud)
App.JS文件 - 路由(使用Express)我为动态图像设置'/ data /: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 );
});
Run Code Online (Sandbox Code Playgroud)
这就完成了工作.有任何问题让我知道:)
我对你在这里尝试做什么感到有点困惑,因为Jade是一种用于文本输出(例如HTML)的condesed标记语言,而不是二进制内容.
既然你正在使用Jade,你可能会有这样的事情:
app.get/'images/:imgtag', function(req, res) {
res.render('image', {imgtag: req.params.imgtag);
});
Run Code Online (Sandbox Code Playgroud)
试试这个:
app.get/'images/:imgtag', function(req, res) {
filerep.getFile( function(imgdata) {
res.header({'Content_type': 'image/jpeg'})
res.end(imgdata);
}, req.params.imgtag );
});
Run Code Online (Sandbox Code Playgroud)
这将使用正确的mime类型将原始文件作为对HTTP请求的响应发送.如果您想使用Jade来传递模板(例如图像弹出窗口),您可以使用不同的路径进行弹出窗口甚至使用数据:uri并对页面中的图像数据进行编码.
| 归档时间: |
|
| 查看次数: |
9671 次 |
| 最近记录: |