2014-01-03 5 views
2

Say Я хочу, чтобы мои загруженные файлы будут храниться в структуре подкаталогов, как показано ниже:Как реализовать создание структуры папок для загрузки файлов на PHP

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

Так что каждая подпапка может содержать 999 файлов max, т.е. когда/uploads/0/достигает своего предела, папка/uploads/1/создается автоматически, и следующий файл идет туда. Каждая папка также может содержать 999 подпапок.

Вопрос в том, как это сделать? Моя основная проблема заключается в том, как определить, где разместить недавно загруженный файл. Не могли бы вы описать алгоритм? Я не могу придумать ничего лучше, чем выполнять эти действия каждый раз:

  1. Глядя на последнюю созданную папку в/загрузки/и, если он пустой - создание одного, например, так:

    $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 и кодировании.
+0

Вы не могли бы, используя дату, как 2013/4/5, в подпапку? – Andrew

+0

И как отделить файлы, которые были загружены в тот же день? Их могут быть тысячи. Мне нужно сохранить каждый в отдельной папке. – dKab

ответ

2

Один из подходов состоит в том, чтобы поддерживать общее количество всех загрузок (атомарно), увеличивая их для каждой загрузки.

Затем каталог может быть создан следующим образом:

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

Это похоже на действительно умное и изящное решение, я даю вам это, сэр, но где я могу хранить общее количество всех загрузок? – dKab

+0

@dKab Есть несколько вариантов; база данных - это один из способов или простой файл, защищенный с помощью консультативной блокировки, см. ['flock()'] (http://php.net/flock). –

+0

Большое спасибо. Я попробую это. – dKab

Смежные вопросы