【问题标题】:Render Image Stored in Mongo (GridFS) with Node + Jade + Express使用 Node + Jade + Express 渲染存储在 Mongo (GridFS) 中的图像
【发布时间】:2012-04-08 07:54:44
【问题描述】:

我有一个使用 GridFS 存储在 Mongo 中的小 .png 文件。我想使用 Node + Express + Jade 在我的网络浏览器中显示图像。我可以很好地检索图像,例如:

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

但我不知道如何使用 Jade View Engine 渲染它。好像没有 文档中的信息。

谁能指出我正确的方向?

谢谢!

【问题讨论】:

    标签: node.js mongodb express pug gridfs


    【解决方案1】:

    我想通了(感谢蒂莫西!)。问题在于我对所有这些技术以及它们如何组合在一起的理解。对于任何有兴趣使用 Node、Express 和 Jade 从 MongoDB GridFS 显示图像的人...

    我在 MongoDB 中的文档有一个对存储在 GridFS 中的 Image 的引用,它是一个 ObjectId,存储为 一个字符串。例如MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'}

    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);
       });
     };
    

    Jade 模板 - 渲染 HTML 标记:

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

    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 );
    });
    

    这样就完成了。有任何问题请告诉我:)

    【讨论】:

      【解决方案2】:

      我对您在此处尝试执行的操作感到有些困惑,因为 Jade 是一种用于文本输出(例如 HTML)的简洁标记语言,而不是二进制内容。

      由于您使用的是 Jade,您可能会遇到这样的情况:

      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 );
      });
      

      这将发送原始文件作为对具有正确 mime 类型的 HTTP 请求的响应。如果您想使用 Jade 交付模板(例如图像弹出窗口),您可以为弹出窗口使用不同的路由,甚至使用 data: uri 并在页面中对图像数据进行编码。

      【讨论】:

      • 修复 mime 类型或从 gridfs 中检测
      • 感谢蒂莫西,这为我指明了正确的方向。我还需要解决其他问题,因此我在下面发布了我的解决方案以确保完整性。
      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 2015-01-13
      • 2014-06-01
      • 1970-01-01
      • 2012-02-06
      • 2013-04-15
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多