PHP: бесконечный цикл чтения папок? - PullRequest
0 голосов
/ 13 июля 2010

Интересно, как я могу решить следующую проблему: Я читаю папку на моем сервере, и я отображаю содержимое следующим образом. если есть изображение, я буду печатать изображение, если есть папка, я буду печатать div со значком папки. Интересно, можно ли щелкнуть одну из этих подпапок, а затем отобразить содержимое этой папки точно так же, как я сейчас отображаю содержимое родительской папки. он должен работать как бесконечный цикл, если внутри папок есть папки.

$path = 'files';

if (($retval = scandir($path)) !== false) {
    $retval = array_filter($retval, 'filter_files');
    shuffle($retval);
}

function filter_files($file) {
    return ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'Thumbs.db');
}

//loop through shuffled files
foreach ($retval as $value) {
    $ext = pathinfo($value, PATHINFO_EXTENSION); //file extension
    if ($ext == "jpg" || $ext == "jpeg" || $ext == "gif" || $ext == "png") {
        print "<img class='thumb' src='$path/$value'/>";
    } else if ($ext == "") { //must be a folder
        print "<div class='thumb folder'><a href=''>link_to_subfolder</a></div>";
    } else {
        //not supported
    }
}

это вообще возможно?

Ответы [ 4 ]

1 голос
/ 13 июля 2010

Для папки укажите параметр GET в ссылке:

echo '<a href="myfile.php?dir=' . $value .'">foo</a>';

Затем в вашем скрипте прочитайте переменную $_GET['dir'], чтобы узнать, какую папку использовать. Вы должны вставить эту переменную в ваш $ path.

Обратите внимание, что вы должны иметь в виду, что если вы позволите кому-либо использовать скрипт, он сможет открыть любую папку, изменив параметр dir. Например. если они передают ../../../../etc, они могут получить доступ к файлу passwd серверов.

0 голосов
/ 13 июля 2010

Не вдаваясь в подробности рекурсии, приведем небольшое редактирование, которое сделает то, что вы хотите что-то похожее на то, что вы хотите (при условии, что ваш код работает).

$base = 'files';

function filter_files($file) {
    return ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'Thumbs.db');
}

function show_directory($path) {
    if (($retval = scandir($path)) !== false) {
        $retval = array_filter($retval, 'filter_files');
        shuffle($retval);
    }

    //loop through shuffled files
    foreach ($retval as $value) {
        $ext = pathinfo($value, PATHINFO_EXTENSION); //file extension
        if ($ext == "jpg" || $ext == "jpeg" || $ext == "gif" || $ext == "png") {
            print "<img class='thumb' src='$path/$value'/>";
        } else if (is_dir($path . '/' . $value)) { // *is* a folder
            print "<div class='thumb folder'><a href=''>link_to_subfolder</a>";
            show_directory($path . '/' . $value);
            print "</div>";
        } else {
            //not supported
        }
    }
}

show_directory($base);

Некоторые справочные материалы:

РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял вопрос, хотя это все еще полезная информация для ОП, я уверен, поэтому я оставлю это пока.

0 голосов
/ 13 июля 2010

В ваших папках, где у вас есть ссылка, установите переменную get для пути к папке, затем, если этот путь существует, укажите путь загрузки к нему:

print "<div class='thumb folder'><a href='yourfile.php?path=".$value."'>link_to_subfolder</a></div>";

В файле:

if(isset($_GET['path'])) $path = $_GET['path'];
else $path = 'files';

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

0 голосов
/ 13 июля 2010

Возможно, вы захотите создать страницу AJAXified, где, если пользователь щелкает папку, он отправляет запрос AJAX на сервер, получает содержимое этой папки и отображает их. Это упростит PHP, но вам придется написать немного JavaScript для этой страницы.

Кроме того, вы можете использовать is_dir(), чтобы решить, является ли каталог каталогом. Проверка наличия расширения файла не является надежной (файлы не обязательно должны иметь расширения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...