Файловый менеджер — всё в одном файле

Встречайте Для просмотра ссылки Войди или Зарегистрируйся — последний в этом году!
Версия 1.1
— Добавлена адаптивность под мобильные устройства
fm_mobile_responsive.png
— Добавлены функции сохранения/восстановления БД
— При скачивании в эксель списка файлов убраны ссылки — они никуда не вели, а объём файла уменьшился
— Исправлена ошибка при сохранении в шаблоне кавычек (').
— Добавлено несколько ссылок в интерфейс для удобства.
Всем удачи в Новом году!
 
PHP:
if(!function_exists('zip')){
    function zip($files, $archive){
        $status = false;
        if(!extension_loaded('zip')) return $status;
        if(class_exists("ZipArchive")){
            $zip = new ZipArchive();
            if(!$zip->open($archive, 1)) return $status;

            if(!is_array($files)) $files = array($files);
            foreach($files as $file){
                $file = str_replace(get_cwd(), '', $file);
                $file = str_replace('\\', '/', $file);
                if(is_dir($file)){
                    $filesIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($file), 1);
                    foreach($filesIterator as $iterator){
                        $iterator = str_replace('\\', '/', $iterator);
                        if(in_array(substr($iterator, strrpos($iterator, '/')+1), array('.', '..'))) continue;

                        if(is_dir($iterator)) $zip->addEmptyDir(str_replace($file.'/', '', $iterator.'/'));
                        else if(is_file($iterator)) $zip->addFromString(str_replace($file.'/', '', $iterator), read_file($iterator));
                    }
                }
                elseif(is_file($file)) $zip->addFromString(basename($file), read_file($file));
            }
            if($zip->getStatusString()!==false) $status = true;
            $zip->close();
        }
        return $status;
    }
}

if(!function_exists('compress')){
    function compress($type, $archive, $files){
        if(!is_array($files)) $files = array($files);
        if($type=='zip'){
            if(zip($files, $archive)) return true;
            else return false;
        }
        elseif(($type=='tar')||($type=='targz')){
            $archive = basename($archive);

            $listsBasename = array_map("basename", $files);
            $lists = array_map("wrap_with_quotes", $listsBasename);

            if($type=='tar') execute("tar cf \"".$archive."\" ".implode(" ", $lists));
            elseif($type=='targz') execute("tar czf \"".$archive."\" ".implode(" ", $lists));

            if(is_file($archive)) return true;
            else return false;
        }
        return false;
    }
}

if(!function_exists('decompress')){
    function decompress($type, $archive, $path){
        $path = realpath($path).DIRECTORY_SEPARATOR;
        $status = false;
        if(is_dir($path)){
            chdir($path);
            if($type=='unzip'){
                if(class_exists('ZipArchive')){
                    $zip = new ZipArchive();
                    $target = $path.basename($archive,".zip");
                    if($zip->open($archive)){
                        if(!is_dir($target)) mkdir($target);
                        if($zip->extractTo($target)) $status = true;
                        $zip->close();
                    }
                }
            }
            elseif($type=='untar'){
                $target = basename($archive,".tar");
                if(!is_dir($target)) mkdir($target);
                $before = count(get_all_files($target));
                execute("tar xf \"".basename($archive)."\" -C \"".$target."\"");
                $after = count(get_all_files($target));
                if($before!=$after) $status = true;

            }
            elseif($type=='untargz'){
                $target = "";
                if(strpos(strtolower($archive), ".tar.gz")!==false) $target = basename($archive,".tar.gz");
                elseif(strpos(strtolower($archive), ".tgz")!==false) $target = basename($archive,".tgz");

                if(!is_dir($target)) mkdir($target);
                $before = count(get_all_files($target));
                execute("tar xzf \"".basename($archive)."\" -C \"".$target."\"");
                $after = count(get_all_files($target));
                if($before!=$after) $status = true;
            }
        }
        return $status;
    }
}
 
PHP:
if(!function_exists('zip')){
    function zip($files, $archive){
        $status = false;
        if(!extension_loaded('zip')) return $status;
        if(class_exists("ZipArchive")){
            $zip = new ZipArchive();
            if(!$zip->open($archive, 1)) return $status;

            if(!is_array($files)) $files = array($files);
            foreach($files as $file){
                $file = str_replace(get_cwd(), '', $file);
                $file = str_replace('\\', '/', $file);
                if(is_dir($file)){
                    $filesIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($file), 1);
                    foreach($filesIterator as $iterator){
                        $iterator = str_replace('\\', '/', $iterator);
                        if(in_array(substr($iterator, strrpos($iterator, '/')+1), array('.', '..'))) continue;

                        if(is_dir($iterator)) $zip->addEmptyDir(str_replace($file.'/', '', $iterator.'/'));
                        else if(is_file($iterator)) $zip->addFromString(str_replace($file.'/', '', $iterator), read_file($iterator));
                    }
                }
                elseif(is_file($file)) $zip->addFromString(basename($file), read_file($file));
            }
            if($zip->getStatusString()!==false) $status = true;
            $zip->close();
        }
        return $status;
    }
}

if(!function_exists('compress')){
    function compress($type, $archive, $files){
        if(!is_array($files)) $files = array($files);
        if($type=='zip'){
            if(zip($files, $archive)) return true;
            else return false;
        }
        elseif(($type=='tar')||($type=='targz')){
            $archive = basename($archive);

            $listsBasename = array_map("basename", $files);
            $lists = array_map("wrap_with_quotes", $listsBasename);

            if($type=='tar') execute("tar cf \"".$archive."\" ".implode(" ", $lists));
            elseif($type=='targz') execute("tar czf \"".$archive."\" ".implode(" ", $lists));

            if(is_file($archive)) return true;
            else return false;
        }
        return false;
    }
}

if(!function_exists('decompress')){
    function decompress($type, $archive, $path){
        $path = realpath($path).DIRECTORY_SEPARATOR;
        $status = false;
        if(is_dir($path)){
            chdir($path);
            if($type=='unzip'){
                if(class_exists('ZipArchive')){
                    $zip = new ZipArchive();
                    $target = $path.basename($archive,".zip");
                    if($zip->open($archive)){
                        if(!is_dir($target)) mkdir($target);
                        if($zip->extractTo($target)) $status = true;
                        $zip->close();
                    }
                }
            }
            elseif($type=='untar'){
                $target = basename($archive,".tar");
                if(!is_dir($target)) mkdir($target);
                $before = count(get_all_files($target));
                execute("tar xf \"".basename($archive)."\" -C \"".$target."\"");
                $after = count(get_all_files($target));
                if($before!=$after) $status = true;

            }
            elseif($type=='untargz'){
                $target = "";
                if(strpos(strtolower($archive), ".tar.gz")!==false) $target = basename($archive,".tar.gz");
                elseif(strpos(strtolower($archive), ".tgz")!==false) $target = basename($archive,".tgz");

                if(!is_dir($target)) mkdir($target);
                $before = count(get_all_files($target));
                execute("tar xzf \"".basename($archive)."\" -C \"".$target."\"");
                $after = count(get_all_files($target));
                if($before!=$after) $status = true;
            }
        }
        return $status;
    }
}
Не знаю, к чему вы это написали. Мне кажется, 80% этого кода под Windows работать не будет.
 
Взял как пример с шела,который и на виндовс машинах работает неплохо.
Ну дело ваше можно и попробовать)
 
Взял как пример с шела,который и на виндовс машинах работает неплохо.
Ну дело ваше можно и попробовать)
Я не пробую всё подряд, для этого мне жизни не хватит.
Ваш пример из шелла использует исполнение команд на хостинге.
Это может: а) не поддерживаться операционкой или б) быть отключено хостером (на 99% виртуальных хостингов отключено, кстати).
Файлменеджер должен работать мало того, что почти везде (как можно больше версий как PHP, так и операционок), так и иметь меньший объём и всё в одном файле при большом функционале.
С точки зрения архивирования. Достаточно и одного архиватора. Архиватор tar.gz будет встроен в менеджер (на случай не полной поддержки формата на хостинге), а zip является на данный момент лишним и я планирую его выпилить.
Почему tar.gz, а не zip?
Потому, что он больше подходит для этих целей:
а) сохраняет права Unix на файлы, в отличие от zip. Это очень полезно при сохранении и восстановлении дампов.
б) протестирован на других проектах и работает стабильно (как при распаковке, так и при запаковке файлов)
в) стабильнее работает на Unix хостингах, а именно на них в основном и придется работать файлменеджеру.
Функция архивации/распаковки — это прежде всего для периодического бекапа.
Я планирую задавать в файлменеджере папку для бекапов и добавить функцию сохранения текущей директории, просмотра бекапов и пр., просто пока не продумал до конца как это будет выглядеть. Возможно, прикрутится ещё удаленное администрирование, сохранение не всех, а только разницы в файлах и прочие полезные для администрирования инструменты.
Если же вы хотите скачать себе на комп и хотите открыть архив под Виндовс, то это ваши проблемы, а не менеджера.
Формат tar.gz прекрасно открывается бесплатным 7-zip, например.

Давайте я напишу, чего мне не хватает и чего бы я хотел добавить в наш инструмент.
1. Как я сказал, запаковка/распаковка архивов. Сейчас работает только запаковка и нестабильно.
2. Сравнение структур двух баз данных MySQL и их синхронизация. Очень актуально для обновлений движков. Если найдете где класс для этого на PHP, чтобы интегрировать в проект, буду благодарен.
3. Система подгрузки плагинов в файлменеджер с внешних урл с сохранением функционала в настройках движка.
4. Хотел бы выкинуть локализацию из кода нахрен вообще. Локализация должна также подгружаться с внешнего урл и сохраняться в файлменеджере при запросе пользователя. А сама локализация храниться где-то и редактироваться пользователями. Может даже, без моего участия.
5. Дальнейшее развитие прокси. Реализация поддержки POST запросов. Сейчас поддерживается только GET и нестабильно. Конечная цель этой приблуды — закачать маленький файлик на свой хостинг и превратить его в прокси для просмотра сайтов, которые забанил тебе твой провайдер интернет. Или использовать для анонимной оценки сайта конкурента, с неизвестного ему адреса — тоже полезно.

В общем, если хотите помочь — направление я задал. Можете предлагать и свое, обсудим.
 
Последнее редактирование:
Может я, конечно, не разобрался, но не переходит в верхнюю папку .. и .

xxx/core/tpl/fm.php?fm=true&path=xxx/core/tpl/user/tpl_100/blocks/ исходная

xxx/core/tpl/fm.php?fm=true&path=xxx/core/tpl/user/tpl_100/blocks/
.. <--
Not Found
The requested URL /404.html was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
 
Может, срабатывает IPS на подозрительные конструкции... Попробуйте вручную забить путь в GET-параметр, без ".."
 
Может я, конечно, не разобрался, но не переходит в верхнюю папку .. и .

xxx/core/tpl/fm.php?fm=true&path=xxx/core/tpl/user/tpl_100/blocks/ исходная

xxx/core/tpl/fm.php?fm=true&path=xxx/core/tpl/user/tpl_100/blocks/
.. <--
Не заходит в папку — значит, там ваши полномочия кончились.
А вы хотели, чтобы хостер пускал вас шариться по чужим папкам?
У хорошего хостера будет ограничение — open_basedir, CageFS, cloud linux etc.
 
Подобный проект я писал 10 лет назад, можете взять из него реализацию многих фич, которые вам нужны
 

Вложения

  • nfm.zip
    31,4 KB · Просмотры: 29
а свежие версии будут ?
хотя и 1.1 хорошо работает
 
Назад
Сверху