【问题标题】:Store images in Mongodb serve them with Nodejs在 Mongodb 中存储图像并使用 Nodejs 为它们提供服务
【发布时间】:2012-07-19 02:16:42
【问题描述】:

我了解 Mongodb 可以通过两种方式存储图像。

  1. 通过将图像存储为二进制文件在常规文档中
  2. 通过 Gridfs 管理更大的图像。

为简单起见,并且由于我计划服务器的图像很小,我将选择选项 1。

为了将图像提供给我使用 nodejs 的浏览器。

我的问题是这有多难?如何将二进制数据转换为浏览器可以理解的实际图像?涉及到什么类型的编码?

您能否指出网络上其他地方的教程/示例?

顺便说一下,出于性能原因,我知道这可能不是一个好主意,我计划在提供图像后缓存这些图像。我只是想完全避免文件系统。

【问题讨论】:

    标签: image node.js mongodb


    【解决方案1】:

    我强烈建议不要从 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()})
    

    【讨论】:

    • 这很有帮助。现在我知道如何存储图像了。您能否扩展您的答案以包括我如何提供图片?
    • 我的意思是这取决于你如何查询他们? var c = db.foo.find({imgname: "something"}; console.log(c.img) 这是你的服务器,所以......我不完全确定如何告诉你提供服务——我假设你正在使用节点?
    • 查询没有问题,我可以把数据拿出来。但是我该如何处理这个二进制数据才能让 Web 浏览器将其呈现为普通图像呢?
    【解决方案2】:

    让您的网络浏览器呈现内容所需要做的就是发送正确的标头和响应正文。

    因此,假设您尝试渲染 PNG 图像,您的 mimetype 将是 image/png,然后将图像文件字节添加到响应正文中。

    然后浏览器会将此响应解释为 PNG 类型的图像并适当地呈现它

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2019-10-24
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多