保存用户图像 - 达到最大文件夹限制

时间:2011-09-25 20:31:41

标签: php image

我正在使用ext3并且根据Wikipedia,允许的最大子目录大约是32000.目前,每个用户都有自己的目录来上传文件系统上的图像。这使得检索图像和访问的简便性变得简单。文件夹结构如下:

../images/<user id>/<image>
../images/<another user id>/<image>

我不想承诺注定会失败并且具有可扩展性的设计,特别是当32k用户上传图像时。虽然这可能永远不会实现,但我仍然认为这是不好的做法。

有没有人有想法避免这个问题?出于不必要的查询和速度的原因,我宁愿不使用数据库。

3 个答案:

答案 0 :(得分:2)

您可以拥有多级层次结构,其中每个级别都保证不会超过最大级别。

例如,如果您的用户ID是使用正则表达式[A-Za-z0-9 _] +定义的,那么对于任何给定的字符,您有64种可能的选择(我在最后添加一个空格来考虑空格当ids更短时)。将两个字符放在一起就有64 * 64 = 4096种可能性。你不能做三个字符,因为这会超过你的限制。然后使用此信息,您可以通过将ID分成两个字母组来创建目录。示例:用户ID“miguel”和“miguel12345”将转到:

/images/mi/gu/el/<image>
/images/mi/gu/el/12/34/5/<image>

注意如果id的长度为奇数,最后一个组件可以是一个char长。这很好,因为空间被视为可能的char,您仍将在最大子目录限制范围内。

祝你好运!

答案 1 :(得分:1)

创建前一个文件充满的子目录

/images/<a>/<user id 1>/<image>
/images/<a>/<user id 2>/<image>
...
/images/<a>/<user id 32000>/<image>
/image/<b>/<user id 32001>/<image>
...

答案 2 :(得分:0)

如果我说得对,这就是某种Web应用程序您可以使用一些抽象层来模仿该文件夹结构并将文件保存在一个目录中。在数据库中保存文件实名,并使用一些唯一名称保存上传的文件。然后从数据库中列出用户文件。