2016-07-27 135 views
5

我有一个像应用程序pinterest。图像和其他相关信息存储在MongoDb中。通常图像的大小约为1 mb。图像以无限滚动显示。加载base64字符串的长脚本时,浏览器崩溃或响应时间确实很长(特别是对于Internet Explorer) 显示存储在MongoDb中的图像的最佳方式是什么?显示存储在MongoDb中的图像

+0

对图像的base64编码是否有任何要求? Mongo支持二进制数据... –

回答

3

我想你有这样的应用程序的一些服务器端的一部分吗?为什么不创建一个小API来检索图像?

所以,你的浏览器将拥有约图像信息,并可以要求你的服务器的话,在线路东西http://your_server/api/image/imageIDhttp://your_server/images/imagename,然后你的服务器将只流这张图片,你不需要这些信息存储在文件系统中。

在客户端(浏览器),你只需要实现“延迟加载”。

+0

为什么不用mongodb存储图像? – TeodorKolev

5

我认为实现这一目标的最好办法,是让你在你的服务器上的一些公用文件夹物理文件。这应该是一种方式,你只需要使用像

http://www.myhost.com/images/my/path/to/image.jpg

你仍可以保持在MongoDB中作为备份您的Base64图像入店,然而,这并不是最好的办法检索您的图像应有的性能问题(如您所见)。我建议你做到以下几点:

每次存储上蒙戈的图像时,请务必将“映像文件”还保存为自身在你的服务器上的一些公共场所。请记住,您应该在您使用的mongo模型上保留该文件的路径。所以,下一次你调用这个对象,而不是得到基本的64位图像时,你只应该得到图像的路径。

比方说,你有你下次就可以查询这个时间模型

myModel = { 
    name: "some name", 
    image64: "someextralongstringveryveryveryweird......", 
    imageUrl: "/images/my/path/to/image/imagename-id.jpg" 
} 

,您可以使用蒙戈投影只是忽略image64,并在您的客户端,您只需要使用一些HTML标签,使得使用的网址。

<img src="/images/my/path/to/image/imagename-id.jpg"> 

这将帮助你在性能上有很多。

有一些库,可以帮助您管理的图像文件生成。 ImageMagick是我曾经使用过的并且非常灵活。

+1

为什么不用mongodb存储图像? – TeodorKolev

+0

检索包含文件URL的查询比检索文件本身要快得多,我认为这会以不同的角度回答你的问题https://stackoverflow.com/questions/7703867/storing-image-files-in- mongo-database-it-a-good-idea – Roger

3

如果您使用的是MongoDB,您应该使用GridFS(http://excellencenodejsblog.com/gridfs-using-mongoose-nodejs/)将数据存储在数据库中,该功能为您的应用程序公开了类似虚拟文件系统的功能。

使用GridFS的,你可以写,从您的MongoDB实例和管道流的请求文件的文件内容,以响应控制器方法。

+0

对于你发布文本文件链接的图像有疑问。干得好 – TeodorKolev

2

我会建议将图像存储在文件系统上,并使用您的Web服务器来处理向客户端提供服务。 为了提高性能,我会将它们放在CDN - 这将能够处理流量。

在您的应用程序存储(mongo)中,您可以将URL /位置存储到图像中,然后在您的JavaScript代码中检索图像时使用它。

此外,在您的代码中,我会建议通过JavaScript预加载图像,在用户滚动查看图像之前预加载图像。有一些伟大的工具,你可以利用这一点。

在无法更改存储空间的情况下,您必须按照它的方式使用mongo - 我会使用javascript预览图像以预加载图像

+0

如果我想将它们存储在数据库中,该怎么办? – TeodorKolev

+0

@TeodorKolev,你可以将它们存储在数据库中。我会推荐base64编码二进制文件并将其存储在数据库中。然后,如果需要,可以提供base64映像,或者通过另一个进程将其转换为二进制文件。可能还有一些性能问题需要考虑。 –

+0

你知道一些很好的例子吗? – TeodorKolev

相关问题