2012-07-19 35 views
5

我知道Mongodb可以以两种方式存储图像。在Mongodb中存储图像为Nodejs提供服务

    在常规文档
  1. 通过经由GridFS的图像作为二进制
  2. 存储用于管理较大的图像。

为了简化和因为我打算服务器的图像小,我会去选择1

要服务于图像我使用一个的NodeJS浏览器。

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

你能指点我在网络上其他地方的教程/例子吗?

顺便说一句,我知道这可能不是好主意,因为性能的原因,我计划缓存一次服务的图像。我只想避免整个文件系统。

回答

5

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

这是非常有帮助的。现在我有一个想法如何存储图像。你能否扩大你的答案,包括我可以如何提供图像? – jamjam 2012-07-19 22:01:16

+0

我的意思是这取决于你如何查询他们? 'var c = db.foo.find({imgname:“something”}; console.log(c.img)' 这是你的服务器所以...我不完全确定如何告诉你服务的东西 - 我假设你正在使用节点? – ranman 2012-07-19 23:15:09

+0

查询不是问题,我可以获取数据。但是,如何处理这些二进制数据以使Web浏览器将其呈现为普通图像? – jamjam 2012-07-19 23:32:24

2

所有你需要做的,让您的网络浏览器呈现的内容是发送正确的头和响应主体。

因此,假设您要呈现PNG图像,您的mimetype将为image/png,然后将图像文件字节添加到响应主体。然后

浏览器会解释这种反应为类型PNG的图片,并使其适当

相关问题