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

Тема в разделе "PHP", создана пользователем Denixxx, 25 ноя 2014.

Модераторы: latteo
  1. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    273
    Симпатии:
    145
    Встречайте новый релиз файлменеджера — последний в этом году!
    Версия 1.1
    — Добавлена адаптивность под мобильные устройства
    fm_mobile_responsive.png
    — Добавлены функции сохранения/восстановления БД
    — При скачивании в эксель списка файлов убраны ссылки — они никуда не вели, а объём файла уменьшился
    — Исправлена ошибка при сохранении в шаблоне кавычек (').
    — Добавлено несколько ссылок в интерфейс для удобства.
    Всем удачи в Новом году!
     
  2. KONG

    KONG Писатель

    Регистр.:
    12 июн 2016
    Сообщения:
    9
    Симпатии:
    0
    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($archive1)) 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($iteratorstrrpos($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;
        }
    }
     
  3. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    273
    Симпатии:
    145
    Не знаю, к чему вы это написали. Мне кажется, 80% этого кода под Windows работать не будет.
     
  4. KONG

    KONG Писатель

    Регистр.:
    12 июн 2016
    Сообщения:
    9
    Симпатии:
    0
    Взял как пример с шела,который и на виндовс машинах работает неплохо.
    Ну дело ваше можно и попробовать)
     
  5. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    273
    Симпатии:
    145
    Я не пробую всё подряд, для этого мне жизни не хватит.
    Ваш пример из шелла использует исполнение команд на хостинге.
    Это может: а) не поддерживаться операционкой или б) быть отключено хостером (на 99% виртуальных хостингов отключено, кстати).
    Файлменеджер должен работать мало того, что почти везде (как можно больше версий как PHP, так и операционок), так и иметь меньший объём и всё в одном файле при большом функционале.
    С точки зрения архивирования. Достаточно и одного архиватора. Архиватор tar.gz будет встроен в менеджер (на случай не полной поддержки формата на хостинге), а zip является на данный момент лишним и я планирую его выпилить.
    Почему tar.gz, а не zip?
    Потому, что он больше подходит для этих целей:
    а) сохраняет права Unix на файлы, в отличие от zip. Это очень полезно при сохранении и восстановлении дампов.
    б) протестирован на других проектах и работает стабильно (как при распаковке, так и при запаковке файлов)
    в) стабильнее работает на Unix хостингах, а именно на них в основном и придется работать файлменеджеру.
    Функция архивации/распаковки — это прежде всего для периодического бекапа.
    Я планирую задавать в файлменеджере папку для бекапов и добавить функцию сохранения текущей директории, просмотра бекапов и пр., просто пока не продумал до конца как это будет выглядеть. Возможно, прикрутится ещё удаленное администрирование, сохранение не всех, а только разницы в файлах и прочие полезные для администрирования инструменты.
    Если же вы хотите скачать себе на комп и хотите открыть архив под Виндовс, то это ваши проблемы, а не менеджера.
    Формат tar.gz прекрасно открывается бесплатным 7-zip, например.

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

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

    antNiX Создатель

    Регистр.:
    22 май 2010
    Сообщения:
    27
    Симпатии:
    1
    Может я, конечно, не разобрался, но не переходит в верхнюю папку .. и .

    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/
    .. <--
     
  7. v1rus74

    v1rus74

    Moderator
    Регистр.:
    2 авг 2016
    Сообщения:
    74
    Симпатии:
    79
    Может, срабатывает IPS на подозрительные конструкции... Попробуйте вручную забить путь в GET-параметр, без ".."
     
  8. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    273
    Симпатии:
    145
    Не заходит в папку — значит, там ваши полномочия кончились.
    А вы хотели, чтобы хостер пускал вас шариться по чужим папкам?
    У хорошего хостера будет ограничение — open_basedir, CageFS, cloud linux etc.