【问题标题】:PHP organize uploaded photosPHP整理上传的照片
【发布时间】:2012-04-27 21:56:12
【问题描述】:

我正在构建一个允许用户上传照片的 PHP 应用程序。为了便于管理,一个文件夹最多可包含 5000 张照片。每张上传的照片都会在数据库中分配一个ID,并且照片将被重命名为ID。

如何查看某个文件夹是否有 5000 张照片?我应该检查照片表中最后一行的 ID 吗?

文件夹应以递增方式命名。例如。 folder_1folder_2

我建议的步骤:

  1. 检索照片表的最后插入 ID
  2. (Last_insert_ID + 1) % 5000 = Some_number(应保存的文件夹编号)
  3. 将照片保存到 folder_some_number。如果文件夹不存在,则新建一个。

或者有更好的方法吗?

【问题讨论】:

  • (Last_insert_ID + 1) % 5000 == 0
  • 如果我是你,我不会使用模数。如果插入因任何原因失败,那么您将跳过该生成的数字(至少在 MySQL 上)并且您的计数将不正确。我会将其作为显式列存储在表中。
  • @RepWhoringPeeHaa,没想到。好吧,如果 (last_insert_id + 1) % 5000 = 0,将使其默认为“文件夹”文件夹。下一个文件夹将是“folder1”
  • @halfer,我真的不需要精确的照片计数。很少有跳过或删除的 ID 应该是可以接受的。通过显式列,您的意思是总照片数的值?
  • 是的,根据@Mike 的回答,显式列 = 每个文件夹的计数,存储在文件夹表中。

标签: php image upload file-organization


【解决方案1】:
$last_id; // for example 9591
$current_folder = floor($last_id/5000);
$picture_num_in_folder = $last_id-($current_folder*5000);
if ($picture_num_in_folder == 5000)
    // new dir and such (new folderid = $current_folder+1 and $picture_num_in_folder = 1)
else
    // just place the picture with unique ID $last_id+1 called image_$picture_num_in_folder+1 in folder $current_folder

【讨论】:

    【解决方案2】:

    我猜数据库读取会比文件系统读取快。

    您最好运行一个 sql 查询并获得每个文件夹的计数,分组。

    // Example Query
    SELECT COUNT(file), folderId As Count FROM photos WHERE folderId IN ('1', '2') GROUP BY folder
    // It would be beneficial to have a flag on the folders that would enable or disable them
    // that way you're not iterating through folders that we already know are > 5k
    // You would run this and have seperate query that would pull in these folder names
    // and passing them to the above query.
    SELECT foldername, folderId FROM folders WHERE countFlag = 0;
    
    
    //Example Conditional.
    if($Count > 5000):
      // Over 5k Do Something
      //Since were over 5k, set this folders flag to 1
      // that way we arent iterating through it again
      $countFlag = 1;
    else:
      // Under 5k Do Something else
    endif;
    

    注意:如果您需要实际的代码示例,我可以快速完成。上述示例省略了实际工作代码,仅用于理论目的。 您需要遍历返回的行,因为它们按文件夹分组。

    【讨论】:

    • 为此 +1。最简单的方法是将当前 ID 和当前文件夹名称保存在数据库中。这样一来,您就知道自己在哪里,而无需进行繁重的查询。
    【解决方案3】:

    让我建议另一种方法: 例如,在图片 ID 上使用散列并使用前几个字符作为路径, 假设图像 ID 为 1,其哈希值为 c4ca4238a0b923820dcc509a6f75849b。 创建目录结构/rootpath/images/c/4/c/ 并在其中保存图像。 您可以使用mkdir() 创建嵌套目录,例如mkdir( '/dir/c/4/c/', 0777, true );

    这样您可以自动将负载分配到多个文件夹中,ID 本身就是路径。

    如果我没记错的话,WordPress 会使用类似的东西...

    【讨论】:

    • 如果我没记错的话,这样的话,我最终会得到这么多文件夹。例如。 5000 张图片最终可能会放入 100 个文件夹中?其中,根据我的要求,我只需要 1 个文件夹。
    • +1 作为可扩展的解决方案。它确保文件夹不会太满,并且当情况需要时,可以通过映射不同的路径在物理机之间分割文件存储。 @Damchey - 你不应该担心有很多文件夹 - 在服务器上,你不会通过 ssh/gui 手动浏览它们。
    • @Damchey,您最终会得到多个目录,但这种结构将以一种不需要您管理每个目录的文件数量的方式平衡其中的文件数量。通常,单个目录中的文件越多,文件系统从该目录中检索文件所需的时间就越长。
    【解决方案4】:

    使用插入 ID 可能不是很准确,因为存在许多可能导致 ID 被“跳过”的错误情况。您可以将文件夹编号存储在名为“folder_number”或类似名称的单独列中。这样您可以获得最高的文件夹编号,然后对该文件夹中的记录数进行计数,如果小于 5000,则将其添加到同一文件夹中,否则运行您的逻辑以增加文件夹计数(创建物理文件夹)。

    这应该比使用文件系统检查要快,对于您所说的文件量来说,这可能会很慢。

    【讨论】:

      【解决方案5】:

      请勿使用自动增量 ID 进行计算。当您删除文件时,您的 ID 序列中会出现漏洞,这会影响您的数学运算。将文件路径保存到您的数据库表。然后做一个简单的 COUNT:

      SELECT filepath, COUNT(filename) AS num FROM mytable
      GROUP BY filepath;
      

      您可以将新文件保存到 num

      【讨论】:

      • 虽然在 OPs 场景中不太可能你会做count() 而不是sum(),但不基于自动递增的 ID 仍然不是一个坏主意。我仍然会使用auto_increment,但只是不要根据 ID 计算您的计数
      • 除非 OP 的失败/回滚数据库操作的百分比很高,否则不太可能过多地忽略计数。目的是不超过 5000,而不是每次都完全是 5000。
      【解决方案6】:

      如果你想这样组织你的文件夹和文件,你不需要检查文件夹是否有5000个文件,只需将文件分配到相应的文件夹。

      如果 x 文件夹中应该已满的文件少于 5000 个(因为最后一个 ID 大于 5000*x),则表示某些图像已被删除。您无法将该 ID 重新分配给数据库中的一行,因此您无法重新填充已删除文件的空间。

      【讨论】:

        猜你喜欢
        • 2011-06-04
        • 2017-02-18
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多