PHP

Диспетчер файлов

Диспетчер файлов - он же - файловый менеджер - нужен для управления сайтом. Обычно хостинг предоставляет такую услугу, но бывает и так, что где-то и как-то нашлось на сервере свободное место и можно поставить на это место сайт, но возникает проблема управления. Например, если домен третьего уровня, не стоит расчитывать, что хозяин домена второго уровня предоставит возможность пользоваться своей системой управления и, тем самым, дать доступ к своему домену. Тогда без файлового менеджера не обойтись. Итак, что должен уметь диспетчер файлов в минимальном и, соответственно, самом простом варианте. Первое - открывать каталоги домена сайта и обеспечивать полную навигацию по сайту. Второе - загружать файлы с компьютера на сервер. Третье - создавать и удалять папки и файлы. И четвертое - давать возможность редактировать файлы. Кроме этого, нужно обрабатывать ошибки, другими словами, выводить сообщения о том как завершилась та или иная операция - успешно или нет. Практика показывает, что такого набора функций вполне достаточно для полноценного управления сайтом. Код простого файлового менеджера:

Теперь подробнее. Первым делом опредеяем основные функции. Сначала - функция вывода массива на экран, которой передается сам массив $arr и некий префикс $tp (для оформления, можно и не передавать). Функция выводит все элементы массива, предворяя их префиксом, и после каждого переводит строку:

function out($tp,$arr){
for($i=0;$i<count($arr);$i++){
echo $tp.$arr[$i]."<BR>";
}echo "<BR>";
}

Следующая функция опредяет размер переданной ей директории в байтах:

Во второй строке получаем имена всех файлов в директории и потом для каждого из них в цикле foreach: 1) определяем, содержится ли в имени файла точка или две точки, если содержатся, то переходим к следующему файлу, 2) если файл является файлом, то определяет его размер в байтах, 3) а если файл является директорией, снова вызываем эту же функцию (такой вызов называется рекуррентным), 4) если директрия пустая, показываем соответствующей ссылкой, что ее можно удалить, 5) а если директория не пустая, добавляем к числу байт слово и 6) возвращаем размер. Теперь функция, загружающая файл на сервер. Ей необходимо передать имя директории, куда будет загружен файл, имя файла и временное имя файла :

Во второй строке функции проверяется, является ли указанный адрес директорией, если нет - то возвращаемся с соответствующим сообщением. Сдедующая функция, которой необходимо передать имя новой директории, создает эту директорию командой mkdir($n_d,0777) (0777 - число, устанавливающее права доступа к созданной директории) и возвращает результат:

Аналогично создается и файл:

Теперь - функция, составляющая список содержимого переданной этой функции директории. Список формируется в виде двумерного массива, в котором элементы $fl[0][] содержат имена папок, а $fl[1][] - имена файлов. Имена оформляются в виде ссылок, для возможности дальнейших действий с папками и файлами, размеры папок определяются уже рассмотренной функцией dir_size. Функция возвращает массив имен:

Последняя функция записывает содержимое $data в файл $rp и возвращает отчет о проделанной работе:

Следующий блок - получение данных из форм (из будет несколько):

$dir=$_GET['dir'];
if(!$dir)$dir=$_POST['dir'];
if(!$dir)$dir=".";
$mode=$_GET['mode'];
$btnd=$_GET['btnd'];
$btnf=$_GET['btnf'];
$btnu=$_POST['btnu'];
$namedir=$_GET['namedir'];
$namef=$_GET['namef'];
$fop=$_GET['fop'];
$btn=$_POST['btn'];
$fc=$_POST['fc'];
$deld=$_GET['deld'];
$del_file=$_GET['del_file'];
$del_f=$_GET['btndel'];
$del_d=$_GET['del_dir'];
$edit=$_GET['edit'];

Здесь: $dir - текущий адрес, если не удалось получить его методом GET и он пуст, то получаем его методом POST, а если и здесь облом, то устанавливаем его на коренной каталог домена. Дальше - $mode - выбор пункта горизонтального меню, $btnd, $btnf и $btnu - переменные, определяющие в какой из форм (создания директории, создания файла или выгрузки файла) нажата кнопка, для $btnu требуется POST, потому, что в другом методу не работает форма загрузки. $namedir и $namef - имена создаваемой директории или файла. Переменная $fop определяет операцию с файлом, $btn - кнопки в форме для редактирования файла, $fc - содержимое окна редактирования. Для двух последних используется метод POST, так как методом GET нельзя передать более одного килобайта, а объемы редактируемых файлов бывают и больше. И, наконец, последними в данном блоке идут переменные для удаления директорий и файлов и переменная редактирования. После этого - обработка нажатия кнопок: если в форме редактирования нажата кнопка 'Сохранить', то записываем файл, обращаясь к соответствующей функции, остальные три строки работают точно так же:

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

Далее - если не выбраны действия с файлами, то сканируем директорию:

if(!$fop){$m=scand($dir);}

Создаем формы подтверждения удаления директорий и файлов:

Формы для загрузки файла, создания папки и файла:

Горизонтальное меню для загрузки и создания файлов и директорий:

и меню для работы с файлами:

Оформляем формы для удобства вывода в массив:

$frm[1]=$upl;
$frm[2]=$cdr;
$frm[3]=$cdf;

Формируем ссалку для кнопки 'Назад', отрезая от текущего адреса все, что после последней косой черты:

Выводим заголовок, основное меню, сообщение о результатах работы, если такое есть и кнопку 'Назад':

Если в переменной $mode что-то есть, выводим соответствующую форму:

if($mode){echo $frm[$mode];}

Далее - аналогично:

И, наконец, если ничего нет, то - содержимое директории:

Скачиваем, проверяем работу. Для практического использования диспетчер надо защитить паролем, ну, чтобы посторонние без разрещения ручонками шаловливыми не лазали. И оформить, чтобы глаз радовал. Как это сделать - уже знаете. Поехали вперед.

Рейтинг@Mail.ru