在DB与文件系统中存储图像,以便在网站中为用户上传的图像

时间:2014-04-24 08:17:13

标签: image web-services mongodb upload gridfs

我正在建立一个允许用户上传图片的网站。每个用户可以使用的最大空间量也有限制。

我有两个想法。

  1. 使用GridFS将图像存储在像mongoDB这样的NoSQL数据库中。
  2. 将图像存储在文件系统中,并将路径存储在DB中。
  3. 以上哪项更好?为什么?

1 个答案:

答案 0 :(得分:12)

叹息为什么每个人都跳到GridFS?

根据图像的大小和确切的用例,我建议将图像直接存储在数据库中(而不是通过GridFS)。原因如下:

文件系统

  • 将图像存储在文件系统中证明效果很好,但并非无足轻重
  • 您将需要一个不同的备份系统,故障转移,复制等。这可能是棘手的DevOps-wise
  • 您需要创建一个漏洞抽象的智能目录结构,因为不同的文件系统具有非常不同的特征。有些人在将16k文件存储在一个文件夹中没有问题,其他人开始只用1k文件来阻塞。一种常见的方法是使用af/2c/af2c2ab3852df91.jpg之类的约定,其中文件夹af2c是从文件名中推断出来的(文件名本身可能是内容的哈希值,用于重复数据删除)。

GridFS的

GridFS用于存储大型文件,以及以与文件系统非常相似的方式存储文件。这有一些缺点:

  • 对于每个文件,您需要一个fs.file和一个fs.chunk文档。大文件完全需要分块,但如果你的文件平均低于256k,则没有真正的分块(默认块大小为256k)。因此,当在GridFS中存储小文件时,您将获得没有优势的开销。糟糕的交易。它还需要两个查询而不是一个。
  • 它会在您的集合中强加某种结构,例如具有“文件名”。这取决于用例,但我经常选择使用哈希作为id并将哈希值存储在用户中。重复数据删除,易于实现,与缓存完美对齐,不需要提出任何约定。它也非常有效,因为索引是一个字节数组。

如果您为摄影师操作网站,他们可以上传他们的RAW文件或10MB的大JPEG,那么情况可能会有所不同。在这种情况下,GridFS可能是一个不错的选择。为了存储用户图像,缩略图等,我只是将图像放在自己的文档中。