-
Урок 9. Файлы и папки в PHP. Пишем файловый менеджер.
Июль 29th, 2008 51 КомментариевВведение
Рано или поздно каждому новичку придется столкнуться с проблемой создания приложения, функционал которого должен позволять просматривать папки и файлы на сервере. Т.е необходимо реализовать файловый менеджер. Применяется данное приложение в административных модулях и на хостингах, для управления файлами через веб-браузер. Конечно в сети есть множество навороченных скриптов, с применением AJAX или javascript’а, функциональность которых практически ничем не отличается от десктопных, но цель нашего урока – ознакомиться с элементарными функциями для работы с папками и файлами.Детали
Рассмотрим основные функции, с которыми мы сегодня ознакомимся:
- Чтение и вывод содержимого директории;
- Создание папки;
- Удаление папки и файлов;
- Переименование папок и файлов;
- Получение размера файлов.
Самая простая задача, которая сейчас стоит перед нами – это научиться считывать содержимое директории на сервере, группировать данные(файла, папки) и выводить их в браузер. Данные скрипты можно тестировать и на локальном сервере, для этого создайте в папке www папку dir, в ней будут наши скрипты. В папке dir создайте папку data. Папка data будет нашей рабочей директорией, в ней необходимо создать несколько любых папок и накидать файлы разных форматов для тестирования.А теперь приступим к программированию. Наш файловый менеджер будет состоять из нескольких файлов:
- index.php – главная страница, с основными логическими операциями;
- functions.inc.php – файл будет содержать все необходимые функции для работы;
- config.inc.php – файл конфигурации.
Чтение директории
Чтобы в дальнейшем небыло вопросов я приведу небольшой фрагмент кода, в котором происходит сканирование директории и вывод содержимого в браузер.
[cc lang="php"]
//Указываем рабочую папку по умолчанию
$url = “data”;
//Проверяем, является ли директорией
if (is_dir($url)) {
//Проверяем, была ли открыта директория
if ($dir = opendir($url)) {
//Сканируем директорию
while (false !== ($file = readdir($dir))){
//Убираем лишние элементы
if ($file != “.” && $file != “..”) {
//Выводим спиоск в браузер
echo $file.”
“;
}
}
//Закрываем директорию
closedir($dir);
}
}
[/cc]Это довольно простое решение, честно признаюсь что данный пример я взял из документации, т.к. ничего другого тут не придумаешь. Это основной принцип, от которого мы будем отталкиваться.
functions.inc.php
Создаем файл functions.inc.php и помещаем туда следующий список функций:
[cc lang="php"]
//Листинг папок
function listing ($url,$mode) {
//Проверяем, является ли директорией
if (is_dir($url)) {
//Проверяем, была ли открыта директория
if ($dir = opendir($url)) {
//Сканируем директорию
while (false !== ($file = readdir($dir))) {
//Убираем лишние элементы
if ($file != “.” && $file != “..”) {//Если папка, то записываем в массив $folders
if(is_dir($url.”/”.$file)) {
$folders[] = $file;
}
//Если файл, то пишем в массив $files
else {$files[] = $file;}
}
}
}
//Закрываем директорию
closedir($dir);
}
//Если режим =1 то возвращаем массив с папками
if($mode == 1) {return $folders;}
//Если режим =0 то возвращаем массив с файлами
if($mode == 0) {return $files;}
}
[/cc]У данной функции в качестве аргументов передаются путь и режим. Если $mode = 1,то функция возвращает массив с папками, если 0, то массив с файлами. Продолжим.
[cc lang="php"]//Функция создания папки
function makedir ($url){
//Вырезаем пробелы и хтмл-тэги
$url = trim(htmlspecialchars($url));
//Если папка создается возвращаем TRUE
if(@mkdir($url)){return TRUE;}
else{return FALSE;} }
[/cc]Данная функция будет создавать папку. Как он будет работать? Для этого существует замечательная функция – mkdir(). Все остальное дело прямых рук=)
[cc lang="php"]
//Функция переименования
function frename ($url,$oldname,$nname){
$nname = trim(htmlspecialchars($nname));
$oldname = trim(htmlspecialchars($oldname));
$url = trim(htmlspecialchars($url));
if(@rename($url.”/”.$oldname,$url.”/”.$nname)){return TRUE; }
else {return FALSE; } }
[/cc]Достаточно простая функция, аргументами которой являются путь, имя старого файла/папки и имя нового файла/папки.
[cc lang="php"]
function removedir ($directory) {
$dir = opendir($directory);
while(($file = readdir($dir)))
{
if ( is_file ($directory.”/”.$file))
{
unlink ($directory.”/”.$file);
}
else if ( is_dir ($directory.”/”.$file) &&
($file != “.”) && ($file != “..”))
{
removedir ($directory.”/”.$file);
}
}
closedir ($dir);
rmdir ($directory);
return TRUE; }
[/cc]Хорошая функция, которая удаляет все вложенные файлы и папки. В качестве аргумента передаем путь(имя) до папки.
[cc lang="php"]
function removefile ($path) {
if(unlink($path)) { return TRUE; }
else { return FALSE; } }
[/cc]
Наиболее упрощенная функция, которая удаляет файл.В качестве аргумента передаем путь(имя) до файла.
[cc lang="php"]
function updir( $path ){
$last = strrchr( $path, “/” );
$n1 = strlen( $last );
$n2 = strlen( $path );
return substr( $path, 0, $n2-$n1 ); }
[/cc]
А вот это очень полезная функция, которая позволит получать имя предыдущей папки.
[cc lang="php"]
//Получаем размер файла
function fsize($path) {
return substr(filesize($path)/1024, 0, 4);
}
?>
[/cc]Простейшая функция для получения размера файла. В качестве аргумента передаем путь до файла. Сохраняем файл с функциями и переходим к главному исполнительному файлу.
index.php
Листинг файлов и папок
[cc lang="php"]
//Подключаем файл конфигурации
include("config.inc.php");
//Подключаем файл с функциями
include("functions.inc.php");//Указываем рабочую папку по умолчанию
if($_GET['url']) {$url = $_GET['url']; }//Шапка
echo 'Текущая директория: '.$url.'
‘;echo ‘[корень] ’;
echo ‘[вверх] ’;
echo ‘[создать папку]
‘;//Листинг папок
if(listing($url,1)) {
foreach(listing($url,1) as $f) {
echo ‘[переименовать]‘;
echo ‘[удалить] ’;
echo ‘
‘.$f.’
‘;
}}
//Листинг файлов
if(listing($url,0)) {
foreach(listing($url,0) as $f) {
echo ‘[переименовать]‘;
echo ‘[удалить] ’;
echo ‘
‘.$f.’ – ‘.fsize($url).’
‘;
}}
[/cc]
Этот фрагмент можно условно поделить на 3 части:- Первая это “шапка” – меню, которое статично и отображается во всех разделах одинаково. Сама “шапка” содержит 3 ссылки: корень, вверх и новая папка.
- Листинг папок. Здесь все просто, при помощи функции foreach производим вывод данных из массива. Рядом с каждой папкой имеются ссылки: переименовать и удалить.
- Листинг файлов. Здесь тоже просходит вывод из массива $files, поэтому рядом с каждым файлом имеются ссылки: переименовать и удалить. Также рядом с каждым файлом выводиться его размер.
Чтобы было нагляднее, я сделал отображение иконки соответсвующей типу файла.
Отдельное слово про навигацию. Здесь все достаточно просто, если скрипту не передаются никакие параметры, то папка по умолчанию будет data, если же мы перешли в другую папку, то $url = $_GET['url'], т.е. тот путь который мы передали по ссылке.
Для того чтобы осуществить подьем на уровень выше (“вверх”) мы используем функцию updir(). Я думаю вы самостоятельно её разберете, в ней нет ничего сложного.
Создание папок
Следующий скрипт позволяет добавлять папки.
[cc lang="php"]
//Создание папок
if($_GET['mkdir'])
{
if(!$_POST['add']) {
echo ‘
‘; }
else {
if(makedir($_POST['url'].”/”.$_POST['ndir'])!== FALSE) {
header(“location:index.php?url=”.$_POST['url']); }
else {echo ‘Ошибка
‘;}
}}
[/cc]Для того чтобы он заработал, скрипту index.php необходимо передать переменную $_GET['mkdir'] . Данное действие реализовано ссылкой в шапке. Обязательно по ссылке передаем текущую рабочую директорию в переменной $url. После того как мы нажали на ссылку, снизу будет отображена форма, в которой необходимо ввести имя новой папки. После нажатия кнопки сработает функция makedir().
Ну вот вроде и разобрались с функцией создания папки, продолжим дальше.
Удаление папок
Чтобы удалить папку нам необходимо использовать следующий код:
[cc lang="php"]
//Удаление папок
if($_GET['rmdir']){
if(removedir($_GET['url'].”/”.$_GET['fname']) !== FALSE) {
header(“location:index.php?url=”.$_GET['url']);
} }
[/cc]Для того чтобы это условие выпонилось, необходимо файлу index.php передать нужные параметры, т.к. при листинге файлов и папок выводятся сервисные ссылки, которые содержат необходимые параметры, то реализовать это будет несложно. Здесь $rmdir=1 означает то, что будет выполнено условие на удаление – if($_GET['rmdir']){} , а необходимые параметры передаем функции removedir() через GET параметры , при успешной завершений которой, происходит редирект на последнюю рабочую папку.
Удаление файлов
Идентичный скрипт, который отличается только исполняемой функцией.
[cc lang="php"]
//Удаление файлов
if($_GET['rmfile']){
if(removefile($_GET['url'].”/”.$_GET['fname']) !== FALSE) {
header(“location:index.php?url=”.$_GET['url']);
[/cc]
Работа этого скрипта полностью повторяет принцип удаления папки.Переименование папок и файлов
Чтобы переименовать файл, нам необходимо знать путь до него, его старое имя и естественно новое имя. Следующий фрагмент кода позволяет переименовывать файлы и папки. Не забывайте что при листинге напротив каждого файла и папки есть ссылка, которая содержит необходимые параметры (путь,имя файла).
[cc lang="php"]
//Переименование папок и файлов
if($_GET['rename'])
{
if(!$_POST['rename']) {
echo ‘
‘; }
else {
if(frename($_POST['url'],$_POST['oldname'],$_POST['nname'])!== FALSE) {
header(“location:index.php?url=”.$_POST['url']); }
else {echo ‘Ошибка
‘;}
}
}
?>
[/cc]Здесь сначала отображается форма, которая дает пользователю сменить имя, после ввода необходимых данных и нажатия на кнопку, запускается функция frename(). Если все завершилось без проблем, то происходит редирект на последнюю папку, в которой мы находились.
config.inc.php
Небольшой файл конфигурации.
[cc lang="php"]//Папка по умолчанию
$url="data";
?>
[/cc]Исходники
Заключение
Конечно данный скрипт не претендует на то чтобы Вы его использовали в своих проектах, т.к. здесь достаточно много различных уязвимостей, но он вполне подходит для поверхностного изучения необходимых функций. Если вам не терпиться можете запросто эксперементировать и добавлять необходимый функционал. Хочу сказать что в следующих уроках мы добавим несколько ключевых функций (копирование, перемещение, загрузка файла на сервер и др), поработаем над дизайном и защитой.
Подпишись на RSS, впереди много интересного.51 Responses to “Урок 9. Файлы и папки в PHP. Пишем файловый менеджер.”





Апрель 30th, 2009 at 21:15
И опять же у меня не работает!
syntax error, unexpected $end
В чём причина?
Апрель 22nd, 2009 at 18:45
ну ведь чтобы отдавать файл (если его не видно через http-сервер напрямую – тогда можно просто ссылку дать), нужно его открыть в двоичном режиме, а пользователю сказать: “сейчас я буду передавать файл”, и начать слать поток. Мне бы с fopen и fread
разобраться. и http – заголовком.
Апрель 19th, 2009 at 11:36
Укажите полный путь до файлы в ссылке
Апрель 18th, 2009 at 22:26
подскажите кто-нибудь, как организовать скачивание файлов, к примеру, mp3??
Апрель 15th, 2009 at 16:01
F1 как переименовывать файлы но что бы расширение оставалось прежним например png
Или как запихнуть в переменную название файла (имя файла)до его расширения (.jpeg)
Март 7th, 2009 at 22:45
Рано ЧПУ новичкам
Март 6th, 2009 at 18:49
Предлагаю развить и прикрутить сюда чпу )
Март 3rd, 2009 at 16:24
после выполнения операции, там где идет перенаправление через http-заголовок лучше наверно адрес указывать в виде:
header(“location: http://”.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'].”?парвметры запроса…
Январь 13th, 2009 at 23:09