2015-06-04 2 views
1

Когда я загружаю фотографии на свой веб-сервер, я пытаюсь разделить фотографии на несколько папок, чтобы у меня не было так много фотографий в одной папке.Итерация через каталоги рекурсивно в PHP

, например, внутри класса:

$filename = hash('crc32b', mt_rand()); 
$img_dir = UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1].DS.$filename[2].$filename[3].DS.$filename[4].$filename[5]; 

DS короткий вариант DIRECTORY_SEPARATOR

Это может создавать каталоги, подобные этим:

public_html\assets\upload\img\25\55\8b 
public_html\assets\upload\img\00\8c\2a 

, если файл не существует, и есть таких каталогов уже нет

$img_path = $img_dir.DS.$filename.'.jpg'; 

if (!file_exists($img_path) && !is_dir($img_dir)) { 
    $mode = 0755; 
    mkdir($img_dir, $mode, true); 

    chmod(UPLOAD_DIR, $mode); 
    chmod(UPLOAD_DIR.DS.'img', $mode); 
    chmod(UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1], $mode); 
    chmod(UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1].DS.$filename[2].$filename[3], $mode); 
    chmod(UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1].DS.$filename[2].$filename[3].DS.$filename[4].$filename[5], $mode); 
} 

Я не хочу, чтобы все папки были 755, как это можно сделать рекурсивно?

EDIT:

Кроме того, почему я получаю 493 как выход, когда я echo $mode; или echo 0755;?

+1

Как для редактирования, '0755' является восьмеричным, который в десятичной системе счисления является' 493' –

ответ

0

Если у вас есть доступ к оболочке, и предполагая, что ОС является Linux, я бы с:

system('chmod -R ' . escapeshellarg(UPLOAD_DIR)); 

Как для редактирования, 0755 является восьмеричной, который в десятичной системе счисления является 493.

EDIT: Вы также можете попробовать эту функцию, нужно учитывать, что $path должен быть полный путь к одному файлу, или путь к директории без пробелов

function chmod_recursive($path, $mode) { 
    if(is_dir($path)) { 
     foreach(glob("$path/*") as $file) { 
      chmod_recursive($file, $mode); 
     } 
    } 
    else if(is_file($path)) { 
     chmod($path, $mode); 
    } 
} 

называя это так:

chmod_recursive(UPLOAD_DIR, 0755); 
+0

Я думаю, вы ответили на мой вопрос, так как я просил рекурсивный метод. Но теперь, когда я думаю об этом, так как я создаю 3 каталога каждый раз, когда кто-то загружает фотографию, я могу закончить с 16^6 = 16777216 каталогами, я не думаю, что я должен делать рекурсивное что-либо из UPLOAD_DIR и вниз , Я думал от самого глубокого DIR и вверх до UPLOAD_DIR. В любом случае спасибо. Я дам вам ответ. – Alex

0

перебрать каталогов, начиная с корня:

foreach (new DirectoryIterator(UPLOAD_DIR) as $fileInfo) { 
    if($fileInfo->isDot()) continue; 
    chmod($fileInfo->getFilename(), $mode); 
} 

взят из here

+0

Это только дало мне папку img, а не весь уровень каталогов. – Alex

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