文件夹结构用于存储数百万张图像?

时间:2012-09-04 04:30:34

标签: php mysql photo storage

我正在建立一个网站,正在查看上传的数百万张照片(上传的每张图片各有3张缩略图),我需要找到存储所有这些图片的最佳方法。

我搜索并找到了存储为哈希的图像示例....例如......

如果我上传,coolparty.jpg,我的脚本会将其转换为Md5哈希导致..

dcehwd8y4fcf42wduasdha.jpg

并存储在/dc/eh/wd/dcehwd8y4fcf42wduasdha.jpg 但对于3个缩略图,我不知道如何存储它们

问题..

  1. 这是存储这些图像的正确方法吗?

  2. 我如何存储缩略图?

  3. 在PHP中,使用上述方法存储这些图像的示例代码是什么?

5 个答案:

答案 0 :(得分:10)

我如何使用文件夹结构:

  • 我正在上传照片,并像你说的那样移动照片:

    $image = md5_file($_FILES['image']['tmp_name']);
    // you can add a random number to the file name just to make sure your images will be "unique"
    $image = md5(mt_rand().$image);
    $folder = $image[0]."/".$image[1]."/".$image[2]."/";
    
    // IMAGES_PATH is a constant stored in my global config
    define('IMAGES_PATH', '/path/to/my/images/');
    // coolparty = f3d40fc20a86e4bf8ab717a6166a02d4
    $folder = IMAGES_PATH.$folder.'f3d40fc20a86e4bf8ab717a6166a02d4.jpg';
    // thumbnail, I just append the t_ before image name
    $folder = IMAGES_PATH.$folder.'t_f3d40fc20a86e4bf8ab717a6166a02d4.jpg';
    // move_uploaded_file(), with thumbnail after process
    // also make sure you create the folders in mkdir() before you move them
    
  • 我相信是基本的方式,当然你可以将文件夹结构更改为更深的文件夹,就像你说的那样,如果你有数百万张图片就会有2个字符。

答案 1 :(得分:7)

您使用这样的方法的原因只是减少每个目录(inode)的文件总数。

使用您描述的方法(3级深度),您每个目录甚至不可能达到数百个图像,因为您的目录最多可达17MM。 16 ** 6。

至于你的问题。

  1. 是的,这是存储它们的好方法。
  2. 我会采用的方式是

    /aa/bb/cc/aabbccdddddddddddddd_thumb.jpg
    /aa/bb/cc/aabbccdddddddddddddd_large.jpg
    /aa/bb/cc/aabbccdddddddddddddddddddd_did.jpg

    或类似的

  3. 就如何实际存储图像而言,网上有很多例子。你有更具体的问题吗?

答案 2 :(得分:2)

如果您正在谈论数百万张照片,我建议您将这些照片发送给第三方,例如Amazon Web Services,更具体地说是针对此Amazon S3。文件数量没有限制,假设您不需要实际列出文件,则根本不需要将它们分成目录(如果您确实需要列出,则可以使用不同的分隔符和前缀 - http://docs.amazonwebservices.com/AmazonS3/latest/dev/ListingKeysHierarchy.html)。而你的托管/重建成本可能会低于自己 - 并且他们会得到备份。

更具体地回答,是的,按子目录拆分;使用您的结构,您可以删除文件名的前5个字符,因为您已经在目录名称中使用它。

正如aquinas所建议的那样,拇指只是在文件名中添加了_thumb1等。或者将它们存储在单独的文件夹中。

答案 3 :(得分:-3)

1)这是你能回答的问题。通常,我更喜欢将图像存储在数据库中,因此您可以拥有一个一致的备份,但是YMMV。

2)怎么样?怎么样/dc/eh/wd/dcehwd8y4fcf42wduasdha_thumb1.jpg,/dc/eh/wd/dcehwd8y4fcf42wduasdha_thumb2.jpg和/dc/eh/wd/dcehwd8y4fcf42wduasdha_thumb3.jpg

3)???您是否在询问如何将文件写入文件系统或...?

答案 4 :(得分:-3)

改善答案。

对于数百万张图片,同样如此,使用数据库会减慢过程的速度是正确的

最好的选择是使用“服务器文件系统”来存储图像,并使用.htaccess来增加安全性。

或者您可以使用网络服务。很多服务器都提供Images Api来上传,显示。 你也可以选择这个选项。例如亚马逊