Вход Регистрация
Файл: classes/ftp.class.php
Строк: 138
<?php
defined
('_VALID') or die('Restricted Access!');
class 
Ftp
{
    const 
ASCII = FTP_ASCII;
    const 
TEXT = FTP_TEXT;
    const 
BINARY = FTP_BINARY;
    const 
IMAGE = FTP_IMAGE;
    const 
TIMEOUT_SEC = FTP_TIMEOUT_SEC;
    const 
AUTOSEEK = FTP_AUTOSEEK;
    const 
AUTORESUME = FTP_AUTORESUME;
    const 
FAILED = FTP_FAILED;
    const 
FINISHED = FTP_FINISHED;
    const 
MOREDATA = FTP_MOREDATA;

    private static 
$aliases = array(
        
'sslconnect' => 'ssl_connect',
        
'getoption' => 'get_option',
        
'setoption' => 'set_option',
        
'nbcontinue' => 'nb_continue',
        
'nbfget' => 'nb_fget',
        
'nbfput' => 'nb_fput',
        
'nbget' => 'nb_get',
        
'nbput' => 'nb_put',
    );

    
/** @var resource */
    
private $resource;

    
/** @var array */
    
private $state;

    
/** @var string */
    
private $errorMsg;



    
/**
     * Magic method (do not call directly).
     */
    
public function __call($name, $args)
    {
        
$name = strtolower($name);
        
$silent = strncmp($name, 'try', 3) === 0;
        
$func = $silent ? substr($name, 3) : $name;
        
$func = 'ftp_' . (isset(self::$aliases[$func]) ? self::$aliases[$func] : $func);

        if (!
function_exists($func)) {
            throw new 
Exception("Call to undefined method Ftp::$name().");
        }

        
$this->errorMsg = NULL;
        
set_error_handler(array($this, '_errorHandler'));

        if (
$func === 'ftp_connect' || $func === 'ftp_ssl_connect') {
            
$this->state = array($name => $args);
            
$this->resource = call_user_func_array($func, $args);
            
$res = NULL;

        } elseif (!
is_resource($this->resource)) {
            
restore_error_handler();
            throw new 
FtpException("Not connected to FTP server. Call connect() or ssl_connect() first.");

        } else {
            if (
$func === 'ftp_login') {
                
$this->state['login'] = $args;
            }

            
array_unshift($args, $this->resource);
            
$res = call_user_func_array($func, $args);

            if (
$func === 'ftp_chdir' || $func === 'ftp_cdup') {
                
$this->state['chdir'] = array(ftp_pwd($this->resource));
            }
        }

        
restore_error_handler();
        if (!
$silent && $this->errorMsg !== NULL) {
            if (
ini_get('html_errors')) {
                
$this->errorMsg = html_entity_decode(strip_tags($this->errorMsg));
            }

            if ((
$a = strpos($this->errorMsg, ': ')) !== FALSE) {
                
$this->errorMsg = substr($this->errorMsg, $a + 2);
            }

            throw new 
FtpException($this->errorMsg);
        }

        return 
$res;
    }



    
/**
     * Internal error handler. Do not call directly.
     */
    
public function _errorHandler($code, $message)
    {
        
$this->errorMsg = $message;
    }



    
/**
     * Reconnects to FTP server.
     * @return void
     */
    
public function reconnect()
    {
        @
ftp_close($this->resource);
        foreach (
$this->state as $name => $args) {
            
call_user_func_array(array($this, $name), $args);
        }
    }



    
/**
     * Checks if file or directory exists.
     * @param  string
     * @return bool
     */
    
public function fileExists($file)
    {
        return 
is_array($this->nlist($file));
    }



    
/**
     * Checks if directory exists.
     * @param  string
     * @return bool
     */
    
public function isDir($dir)
    {
        
$current = $this->pwd();
        try {
            
$this->chdir($dir);
        } catch (
FtpException $e) {
        }
        
$this->chdir($current);
        return empty(
$e);
    }



    
/**
     * Recursive creates directory.
     * @param  string
     * @return void
     */
    
public function mkDirRecursive($dir)
    {
        
$parts = explode('/', $dir);
        
$path = '';
        while (!empty(
$parts)) {
            
$path .= array_shift($parts);
            try {
                if (
$path !== '') $this->mkdir($path);
            } catch (
FtpException $e) {
                if (!
$this->isDir($path)) {
                    throw new 
FtpException("Cannot create directory '$path'.");
                }
            }
            
$path .= '/';
        }
    }

}



class 
FtpException extends Exception
{
}
Онлайн: 1
Реклама