FTP Indexer Class by Sharky

Discussion in 'PHP' started by Sharky, 12 Sep 2009.

  1. Sharky

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    FTP Indexer Class by Sharky

    Описание:
    Не так давно со мной случилось ужасное событие - я остался без интернета. И при поиске чего либо приходилось обходиться пользовательскими фтп в локалке. Руками это было делать неудобно, так и родилась идея индексировать файлы на фтп и потом удобно всё это искать. Собственно для этого и написан, данный мини-класс. Также можно использовать как основу для поиска файлов, допустим, в фтп ифреймере.

    Функции (и примеры использования):

    1. Подключение и авторизация

    PHP:
    #Сиснтаксис
    $ftpic = new FtpIC([сервер], [порт], [таймаут], [логин], [пароль], [Отображение ошибок]);

    #Пример 
    $ftpic = new FtpIC("example.com"2110"Anonymous""12345"true);
    Значения по умолчанию:

    [порт] - 21
    [таймаут] - 10 (в секундах)
    [логин] - Anonymous
    [отображение ошибок] - true

    Ответы:

    В случае удачного подключения и авторизации возвращает TRUE.

    При неудачном подключении возвращает FALSE и, если влючено отображение ошибок выводит "Истекло время подключения."

    При неудачной авторизации возвращает FALSE и, если влючено отображение ошибок выводит "Неверный логин или пароль.".

    2. Закрытие соединения

    PHP:
    #Пример

    $ftpic->disconnect();

    Ответы:

    При удачном разрыве соединения возвращает TRUE.

    Если не удалось закрыть подключение, то возвращает FALSE и, если включено отображение ошибок выводит "Не удалось закрыть подключение.".

    3. Древовидная структура файлов и папок.

    PHP:
    #Синтаксис
    $ftpic->tree([корневая папка], [глубина построения]);
    #Пример
    $ftpic->tree("/www/"2); //слэш вконце обязателен для корректной работы
    Значения по умолчанию:

    [корневая папка] - /
    [глубина построения] - 0

    Ответы:

    В случае успех возвращается массив со структурой файлов и папок фтп. Содержимое также делится на два подмассива [dir] и [file]

    PHP:
    #Пример ответа
    [stats] => Array
                    (
                        [
    file] => Array
                            (
                                [
    0] => webalizer.example.com.txt
                                
    [1] => webalizer.site.com.txt
                                
    [2] => edyvobshe.net.txt
                            
    )
     
                    )
    Если не удалось получить список файлов с фтп возвращается FALSE и, если включено отображение ошибок выводит "Не удалось получить содержимое папки.".

    4. Поиск файлов

    PHP:
    #Синтаксис
    $ftpic->find([объект поиска], [корневая папка]);
    #Пример
    $ftpic->find("index""/"); //поиск всех в фалов в имени которых встречается index
    Значения по умолчанию:
    [корневая папка] - /

    Ответы:
    В случае удачи возвращается массив с полным путем до файла от заданного корня.
    PHP:
    #Пример
    $ftpic->find("webalizer""/");
    #вернёт
     
    Array
    (
        [
    0] => /examlpe.com/webalizer/webalizer.current
        
    [1] => /examlpe.com/webalizer/webalizer.hist
        
    [2] => /stats/webalizer.examlpe.com.txt
    )
    Source:

    PHP:
    <?php
    #FTP Indexer Class by Sharky
    class FtpIC {
        
        function 
    FtpIC($ftp_server$port 21$timeout 10$ftp_user 'Anonymous'$ftp_pass '12345'$display_errors true) {
            
    error_reporting );
            
    set_time_limit );
            
    $this->sock ftp_connect $ftp_server$port$timeout );
            if (! 
    $this->sock) {
                if (
    $display_errors == true)
                    
    $this->display_error );
                return 
    false;
            } elseif (! 
    ftp_login $this->sock$ftp_user$ftp_pass )) {
                if (
    $display_errors == true)
                    
    $this->display_error );
                return 
    false;
            } else {
                
    ftp_pasv $this->socktrue );
                return 
    true;
            }
        }
        
        function 
    disconnect() {
            
            if (
    is_resource $this->sock ) == true) {
                
    ftp_close $this->sock );
                return 
    true;
            } else {
                if (
    $display_errors == true)
                    
    $this->display_error );
                return 
    false;
            }
        }
        
        function 
    tree($dir '/'$gl 0) {
            
    $contents ftp_rawlist $this->sock$dir );
            if (! 
    $contents) {
                if (
    $display_errors == true)
                    
    $this->display_error );
                return 
    false;
            } else {
                foreach ( 
    $contents as $i ) {
                    
    $explode preg_split "/[\s]+/"$i);
                    if (
    substr $explode [0], 0) == "d") {
                        if (
    $gl == 0) {
                            
    $result ['dir'] [$explode [8]] = $explode [8];
                        } else {
                            
    $result ['dir'] [$explode [8]] = $this->tree $dir "/" $explode [8], $gl );
                        }
                    } else {
                        
    $result ['file'] [] = $explode [8];
                    }
                }
                return 
    $result;
            }
        }
        
        function 
    find($obj$dir '/') {
            
    $lll $this->tree $dir);
            
    $keys array_keys $lll ['dir'] );
            foreach ( 
    $keys as $p ) {
                
    $res $this->find $obj$dir $p "/" );
                if (
    sizeof $res ) > 0) {
                    foreach ( 
    $res as $it ) {
                        
    $result [] = $it;
                    }
                }
            }
            
            foreach ( 
    $lll ['file'] as $i ) {
                if (
    strstr $i$obj )) {
                    
    $result [] = $dir $i;
                }
            }
            return 
    $result;
        }
        
        function 
    display_error($error_num) {
            
    $error [0] = 'Истекло время подключения.';
            
    $error [1] = 'Неверный логин или пароль.';
            
    $error [2] = 'Не удалось закрыть подключение.';
            
    $error [3] = 'Не удалось получить содержимое папки.';
            echo 
    '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/htm; charset=windows-1251">
    <style type="text/css">
    body {
        background-color: #fff;
        margin: 40px;
        font-family: Lucida Grande, Verdana, Sans-serif;
        font-size: 12px;
        color: #4F5155;
    }

    h1 {
        color: #444;
        background-color: transparent;
        border-bottom: 1px solid #D0D0D0;
        font-size: 16px;
        font-weight: bold;
        margin: 24px 0 2px 0;
        padding: 5px 0 6px 0;
    }

    code {
        font-family: Monaco, Verdana, Sans-serif;
        font-size: 12px;
        background-color: #f9f9f9;
        border: 1px solid #D0D0D0;
        color: #002166;
        display: block;
        margin: 14px 0 14px 0;
        padding: 12px 10px 12px 10px;
    }
    </style>
    </head>
    <body>
    <h1>Ошибка</h1>
    <code>' 
    $error [$error_num] . '</code>
    </body>
    </html>
    '
    ;
        }

    }
    #with love by Sharky
    #С пожертвованиями на корм программисту можно обращаться сюда /member.php?u=24005
    ?>
    Или скачать архивом:

    WebFile.ru
    Rapidshare.com
     
    8 people like this.
  2. +casper+

    +casper+ Banned

    Joined:
    27 Jun 2009
    Messages:
    158
    Likes Received:
    34
    Reputations:
    0
    Молодец, хорошая весчь. Надо будет испытать=)
     
  3. ReduKToR

    ReduKToR Active Member

    Joined:
    5 Jan 2009
    Messages:
    257
    Likes Received:
    179
    Reputations:
    4
    Вот это однозначно пригодится!