图片上传存储策略

2022-08-30 13:58:16

当用户将图像上传到我的网站时,图像会经历此过程;

  • 用户上传图片
  • 将 pic 元数据存储在 db 中,为图像提供唯一的 ID
  • 异步图像处理(缩略图创建、裁剪等)
  • 所有图像都存储在同一上传文件夹中

到目前为止,该网站还很小,上传目录中只有大约200,000张图片。我意识到我远未达到目录中文件的物理限制,但这种方法显然不会扩展,所以我想知道是否有人对处理大量图像上传的上传/存储策略有任何建议。

编辑:创建用户名(或更具体地说,userid)子文件夹似乎是一个很好的解决方案。通过更多的挖掘,我在这里找到了一些很棒的信息;如何在文件系统
中存储映像 但是,如果将CDN购买到等式中,这种用户ID dir方法可以很好地扩展吗?


答案 1

我以前回答过类似的问题,但我找不到它,也许OP删除了他的问题......

无论如何,Adams解决方案似乎是迄今为止最好的,但它并不是防弹的,因为(或任何其他dir/subdir对)仍然可能包含多达16 ^ 30个唯一哈希值,如果我们计算图像扩展名,则至少可以多3倍的文件,远远超过任何常规文件系统可以处理的文件。images/c/cf/

AFAIK,SourceForge.net 也将此系统用于项目存储库,例如,“fatfree”项目将被放置在 ,但是我相信他们将项目名称限制为8个字符。projects/f/fa/fatfree/


我将图像哈希与/ / 字段一起存储在数据库中,指示图像何时上传/处理,然后将图像放在这样的结构中:DATEDATETIMETIMESTAMP

images/
  2010/                                      - Year
    04/                                      - Month
      19/                                    - Day
        231c2ee287d639adda1cdb44c189ae93.png - Image Hash

艺术

images/
  2010/                                    - Year
    0419/                                  - Month & Day (12 * 31 = 372)
      231c2ee287d639adda1cdb44c189ae93.png - Image Hash

除了更具描述性之外,这种结构足以在几千年内每天托管数十万张(取决于您的文件系统限制)的图像,这就是Wordpress和其他人这样做的方式,我认为他们在这个问题上做对了。

复制的图像可以很容易地在数据库中查询,你只需要创建符号链接。

当然,如果这对您来说还不够,您可以随时添加更多的子目录(小时,分钟等)。

就个人而言,除非您的数据库中没有该信息,否则我不会使用用户ID,因为:

  1. 在网址中披露用户名
  2. 用户名是易失性的(您可以重命名文件夹,但仍然...)
  3. 用户可以假设上传大量图像
  4. 没有任何目的(?

关于CDN,我看不出这个方案(或任何其他方案)有任何理由不起作用......


答案 2

MediaWiki生成上传文件名称的MD5总和,并使用MD5的前两个字母(例如,总和“cf1e66b77918167a6b6b972c12b1c00d”)的“c”和“f”)来创建此目录结构:

images/c/cf/Whatever_filename.png

您还可以将映像 ID 用于每个目录的文件数的可预测上限。也许可以确定父目录,每个目录有1000个图像。floor(image unique ID / 1000)


推荐