5

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

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

文件夹应以递增方式命名。例如。folder_1,folder_2等。

我建议的步骤:

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

还是有更好的方法来做到这一点?

4

6 回答 6

5

我猜数据库读取将比这样的文件系统读取更快。

你最好运行一个 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;

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

于 2012-04-16T14:47:52.683 回答
2
$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
于 2012-04-16T15:07:40.957 回答
1

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

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

您可以将新文件保存到 num < 5000 的文件路径。

于 2012-04-16T14:53:12.600 回答
1

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

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

于 2012-04-16T14:54:05.460 回答
1

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

通过这种方式,您可以自动将负载分配到多个文件夹中,并且 ID 本身就是路径。

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

于 2012-04-16T14:55:49.820 回答
-1

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

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

于 2012-04-16T14:52:43.463 回答