【问题标题】:What is the best directory structure for handling large amounts of images uploaded?处理大量上传图片的最佳目录结构是什么?
【发布时间】:2011-05-23 22:36:50
【问题描述】:

我正在创建一个网站,该网站需要为每个用户上传个人资料图片以及调整大小的版本。我将使用 mysql 来存储图像的 ID 和其他信息。我不想处理重新排列静态文件,所以假设这个站点有成千上万的用户。我想知道存储图像的最佳目录结构是什么?

我之前见过几种提到的方法:

1) md5(image_id),那么如果hash是49f68a5c8493ec2c0bf489821c21fc3b,那么结构就是/49/f6/8a/5c/84/93/ec/2c/0b/f4/89/82/1c/21/ fc/3b.jpg(或.....3b/filename.jpg)。这种方式似乎可以处理很多事情,但看起来它可能会创建一些太多的目录。可能是这种方法的变体?

2) /年/月/日/(可能是小时)/id.jpg

那该怎么办呢?

【问题讨论】:

  • 你说的这个image_id是什么?使用php你怎么找到它?

标签: mysql image directory-structure


【解决方案1】:

像这样在唯一哈希上钻取子目录是一个很好的解决方案,但是您的示例中的子目录数量方式太多了。每个两个字符的子目录可以支持 256 个条目,因此,如果您将拥有 5000 个用户,那么当只深入一层时,每个子目录只会获得大约 20 个文件,这是完全合理的。两个级别的深度将轻松处理数百万用户。

另外,我不会将文件名剪切为散列中剩余的任何字符。使用完整的散列作为文件名,无论您进入多少层。如果您需要(例如)将文件移动到新商店,文件将更容易管理。即,不要这样做:

49/f68a5c8493ec2c0bf489821c21fc3b.jpg

这样做:

49/49f68a5c8493ec2c0bf489821c21fc3b.jpg

【讨论】:

    【解决方案2】:

    如果我将文件名作为 id 来存储图像,我倾向于使用以下结构;

    /0/1.jpg
    /500/501.jpg
    /1000/1001.jpg
    /1500/1501.jpg
    

    这个想法是创建不超过 500 个图像的文件夹,并将基本文件夹编号作为起点。这不需要任何特殊的数据库字段或散列,您可以选择多于或少于 500 个。

    【讨论】:

      【解决方案3】:

      图像/md5(user_id)/user_id/*.jpg 的前两个字符

      这样你就没有包含数千个其他文件/目录的目录,并且避免了太多的嵌套树

      例如

      images/a9/1000/foo.jpg
      images/a9/1000/bar.jpg
      images/a9/107/baz.jpg
      images/1f/24/goo.jpg
      

      【讨论】:

        【解决方案4】:

        我通常以如下格式将密钥存储在图像记录旁边的数据库中:

        userid/md5(image_id)_time.ext
        

        这很好,因为它可以防止人们在不做大量工作的情况下“窃取”您的整个收藏。另外,它有助于名称冲突,以防您更新原始图片并希望将“旧”图片存储一段时间(这在某些情况下可能是有益的)。另外,您可以将其设置为永不过期,因为您将永远不会再次更新它。您可能需要定期进入并刷新“旧”文件,但这是一个不同的问题。

        【讨论】:

          猜你喜欢
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          • 2012-05-07
          • 2023-03-21
          相关资源
          最近更新 更多