在服务器上组织数千个图像

时间:2010-02-25 19:17:12

标签: storage

我正在开发一个网站,可能会增加到几千个用户,所有这些用户最多可以在服务器上上传十张图片。 我想知道什么是存储图片的最佳方式。 让我们假设我有5000个用户,每个有10张图片,这给了我们5万张照片。 (我想在blob中将它们存储在数据库中不是一个好主意;))

这是为每100个注册用户动态创建目录的好方法吗(总共50个目录,假设有5000个用户),并在那里上传他们的图片?命名约定'xxx_yy.jpg'(xxx是用户ID和yy图片编号)是否可以? 但是,在这种情况下,一个文件夹中会有1000张(100x10)图片,是不是太多了?

3 个答案:

答案 0 :(得分:3)

我很可能会通过其内容的哈希来存储图像。例如,128位SHA。因此,我将用户上传的图像'foo.jpg'重命名为128位sha(可能在base 64中,对于统一的16个字符的名称),然后将用户的文件名及其SHA存储在数据库中。我可能还会添加引用计数。然后,如果一些人都上传了相同的图像,它只会被存储一次,你可以在所有引用都消失时删除它。

对于实际的物理存储,既然您拥有有保证的统一命名方案,则可以将文件系统用作平衡树。您可以决定目录中最多需要多少文件,并让平衡器移动文件来维护它,或者您可以想象完全填充的树的样子,并以这种方式存储您的文件。

这个方案唯一真正的缺点是它将文件名与内容分离,因此数据库丢失可能意味着不知道任何文件被调用,但是你应该小心备份这类信息。

答案 1 :(得分:2)

不同的文件系统对包含大量文件的目录的执行方式不同。有些人放慢了速度。有些人根本不介意。例如,IBM JFS2 stores the contents of directory inodes as a B+ Tree sorted by filename ....所以即使在非常大的目录的情况下,它也可能提供log(n)访问时间。

lsdir读取,排序,获取大小/日期信息,并将它们打印到stdout与完全不同的任务是访问给定文件名的文件内容....所以不要让ls无法列出一个巨大的目录指导你。

无论你做什么,都不要太早优化。只需确保您的文件访问机制可以被提取(使用.getfile(id)的FileStorage,或者......)。

通过这种方式,您可以放入您喜欢的任何目录结构,或者例如,如果您发现将这些项目作为BLOB column存储在数据库中更好,那么您可以选择...

答案 2 :(得分:0)

授予我从未存储过50,000张图像,但我通常只将所有图像存储在同一目录中,并将其命名为避免冲突。然后将引用存储在db。

$ext = explode( '.', $filename );
$newName = md5( microtime() ) . '.' . $ext;

这样你永远不会有与microtime相同的两个文件名永远不会相同。