【问题标题】:How to implement the creation of folders structure for uploaded files on php如何在php上实现为上传文件创建文件夹结构
【发布时间】:2014-01-20 20:17:58
【问题描述】:

假设我希望将我上传的文件存储在如下所示的子目录结构中:

    /uploads/0/0/kitten.jpg;
    /uploads/0/1/kitten1.jpg;
    /uploads/1/10/pic.jpg;

这样每个子文件夹最多可以包含 999 个文件,即当 /uploads/0/ 达到其限制时,文件夹 /uploads/1/ 会自动创建,下一个文件会放在那里。每个文件夹还可以包含 999 个子文件夹。

问题是 - 我该怎么做? 我主要关心的是如何确定将新上传的文件放在哪里。你能描述一下算法吗?我想不出比每次都执行这些步骤更好的方法了:

  1. 在 /uploads/ 中查找最新创建的文件夹,如果它是空的 - 创建一个,如下所示:

    $contents = $scandir('/uploads');
        $dirs = array();
        foreach ($contents as $path) {
            if (is_dir($path)) {
              $dirs[] = $path;
            }
        }
        if (empty($dirs)) {
             //create new dir and save file there subsequently
             $saveTo = $parentDir . DIRECTORY_SEPARATOR . "1" . DIRECTORY_SEPARATOR . "1";
             mkdir($saveTo, 0777, true);
        } else {
            $last = array_pop($dirs);
        }
    
  2. 我们对这个子文件夹做的基本相同等等(我想我可能想以某种方式在这里使用递归)。我是在朝着正确的方向前进,还是我把事情复杂化了?有一个更好的方法吗?任何事,请。我只是 php 和编码的初学者。

【问题讨论】:

  • 您介意使用日期(例如 2013/4/5)作为子文件夹吗?
  • 又如何区分同一天上传的文件呢?可能有成千上万个。我需要将每一个存储在单独的文件夹中。

标签: php file-upload uploading


【解决方案1】:

一种方法是保持所有上传的运行总数,(原子地)为每次上传增加它。

然后可以像这样创建目录:

$dir = sprintf('/uploads/%d/%d', floor($total / 1000), $total % 1000);
if (!file_exists($dir)) {
    mkdir($dir, 0755, true);
}

【讨论】:

  • 这看起来是一个非常聪明和优雅的解决方案,我给你了,先生,但是你在哪里存储所有上传的总数?
  • @dKab 有几个选项;数据库是一种方式,或者是受建议锁定保护的简单文件,请参阅flock()
  • 非常感谢。我会试试的。
猜你喜欢
  • 1970-01-01
  • 2021-09-19
  • 2012-05-03
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多