PHP组织上传的照片

时间:2012-04-16 14:45:27

标签: php image upload file-organization

我正在构建一个允许用户上传照片的PHP应用程序。为了使其易于管理,文件夹最多应有5000张照片。每张上传的照片都将在数据库中分配一个ID,照片将重命名为ID。

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

文件夹应逐步命名。例如。 folder_1folder_2

我建议的步骤:

  1. 检索照片表的最后一个插入ID
  2. (Last_insert_ID + 1)%5000 = Some_number(应保存的文件夹编号)
  3. 将照片保存到folder_some_number。如果文件夹不存在,请创建新文件夹。
  4. 或者有更好的方法吗?

6 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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

答案 2 :(得分:1)

请勿使用自动增量ID进行计算。当你删除文件时,你的ID序列中会出现漏洞会导致数学失败。将文件路径保存到db表。然后做一个简单的COUNT:

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

如果我的记忆服务,WordPress使用类似的东西......

答案 5 :(得分:-1)

如果您想以这种方式组织文件夹和文件,则无需检查文件夹是否包含5000个文件,只需将文件分配到相应的文件夹即可。

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