在为图库存储图像时,最佳做法是什么?

时间:2012-01-25 09:02:44

标签: php mysql apache uploadify

我的问题不是将图像存储在磁盘上或数据库中。

  • 图像将存储在磁盘上
  • 图像路径和其他图像数据将保存在数据库中。
  • 图像将被赋予唯一的文件名
  • 图像将以3种尺寸
  • 存储
  • 许多用户可能会使用许多图像

我的问题是:
- 图像应存储在一个文件夹还是多个文件夹中? - 使用md5创建唯一ID是否可以?例如。 MD5(ID +文件名+ random_num)
- 图像应缓存在服务器上还是客户端浏览器/计算机上?

还有什么我应该想到的吗?

解决方案是使用php,apache和mysql。我们使用Uploadify上传图片。

我今天使用的一些代码

  /**
   * Calculate dir tree for object
   * Folders starts from 00 to FF (HEX) and can have just as
   * many subfolders (I think :)
   * @param $id - User ID
   * @param $type - Image category
   * @return string
   */
  function calculateDirTree($id, $type)
  {
      $hashUserID   = substr(hash('md5', $id), -4);
      $parentFolder = substr($hashUserID,0,2);
      $subfolder    = substr($hashUserID,2);    
      $basePath     = $type."/".$parentFolder.'/'.$subfolder.'/';

      return $basePath;
  }  

5 个答案:

答案 0 :(得分:3)

根据您要处理的图像数量,我强烈建议您使用多个文件夹。最简单的方法应该是使用文件名的第一个字母来创建文件夹结构。我想,数字是这样的:

less than 1000 images  --> one folder
less than 20000 images --> one level of folders (a, b, c, ...)
more                   --> several levels (a containing aa, ab, b containing ba, bb, ...)

YMMV

答案 1 :(得分:3)

图像应该存储在一个文件夹还是多个文件夹中?

你在谈论“100k - 200k图像”这么多文件夹是必须的。尽量拥有最大值。文件夹中有~1000张图片。

使用md5创建唯一ID是否可以?例如。 MD5(ID +文件名+ random_num)

是的,你可以这样做。它将避免长文件名的问题。

图像应缓存在服务器上还是客户端浏览器/计算机上?

应该在客户端缓存。这么多图像的问题在于它会产生很高的流量。在客户端上缓存有助于减少这种情况。

答案 2 :(得分:0)

关于缓存,最好将其缓存在两端,这样可以快速检索新图像,访问现有图像的用户可以缓存它。

我不知道有关将它们存储在一个或多个文件夹中的任何文件系统限制。

答案 3 :(得分:0)

我认为使用多个文件夹或同一文件夹取决于您的Web应用程序。例如,如果有多个配置文件,每个配置文件具有多个图像,则可以使用多个文件夹,并使用文件夹名称作为配置文件名称。

我的最后建议是,如果你有大量的图像sha256加密算法更好地防止碰撞

答案 4 :(得分:0)

定义去文件系统:它更高效,更适合存储文件(这就是为什么做的)。保存/检索大图像时,Sql可能会变慢。 您可以为每个用户创建一个文件夹(使用ID作为文件夹名称),并且在文件系统上保存图像时,可以将引用保存在UserImages表上(通过在sql上保存文件名)。您可以通过在保存时重命名每个图像来确保每个图像都有一个唯一的文件名,您可以使用原始文件名与实际DateTime的组合(不需要使用MD5)。 此外,应始终缓存图像,以便为您和客户保存带宽。