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

Ahm*_*bib 8 upload web-services image mongodb gridfs

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

我有两个想法.

  1. 使用GridFS将图像存储在像mongoDB这样的NoSQL数据库中.
  2. 将图像存储在文件系统中并将路径存储在DB中.

以上哪个更好?为什么?

mne*_*syn 14

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

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

文件系统

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

GridFS的

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

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

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