Просмотр файла class.ftp.php

Размер файла: 17.58Kb
<?php
/*
Автор: MOBNET
Требования: php, tcp socket и конечно немношко мозга. :-D
Вся вспомогательная инфа для написания данного класса была соберана спомащью: http://google.com/codesearch

!!!Всё юзайте наздаровье:)!!!
*/

//Константы с текстом ошибок

define('err_conn','Ошибка соединения');
define('err_pasv','Ошибка установки пассивного режима');
define('err_auth','Ошибка авторизации');
define('err_rawlist','Ошибка получения подробного списка файлов из каталога');
define('err_type','Ошибка установки режима передачи');
define('err_chdir','Ошибка изминения тикущего каталога');
define('err_pwd','Ошибка получения текущего каталога');
define('err_cdup','Ошибка перехода в родительский каталог ".."');
define('err_put','Ошибка передачи файла на ftp сервер');
define('err_get','Ошибка получения файла с ftp сервера');
define('err_mkdir','Ошибка создания каталога на ftp сервере');
define('err_rmdir','Ошибка удаления каталога на ftp сервере');
define('err_rename','Ошибка переименования файла на ftp сервере');
define('err_mdtm','Ошибка при получении времени последнего изменения файла на ftp сервере');
define('err_size','Ошибка при получении размера файла на ftp сервере');
define('err_site','Ошибка при выполнении команды site на ftp сервере');
define('err_chmod','Ошибка при установке chmod файлу на ftp сервере');
define('err_delete','Ошибка удаления файла на ftp сервере');
//Константы с режимами передачи

define('type_ascii','A');
define('type_binary','I');
define('type_l7','L 7');
define('type_l8','L 8');
class ftp
{

//Переменные класса

var $sock,$error;
var $pasv=false;
/* socket(string host, int port, int time) функция открытия tcp соединения на переданный ей $host и $port,
$time это время роботы сокета в секундах,по умалчанию 60секунд.Функция вслучие ошибки возращает false, в случие успеха возращается дескриптор сокета
*/
function socket($host,$port=21,$time=60)
{
$sock=fsockopen('tcp://'.$host,$port,$errno,$errstr,$time);
if(!$sock)
{
$this->error=$errno.' ,'.$errstr;
return false;
}
return $sock;
}
/* open_ftp(string host, int port) функция открытия соединения на указанный в $host ftp сервер и $port.Возращает true вслучие успеха и falsе при неудаче  */
function open_ftp($host,$port)
{
$this->sock=$this->socket($host,$port);
if(!$this->sock)
{
$this->error=err_conn.' с '.$host.':'.$port.', '.$this->error;
return false;
}
$read=fgets($this->sock);
// print '<b>open:</b> '.$read.'<br>';
if(strpos($read,'220')===false)
{
$this->error=err_conn.' с '.$host.':'.$port;
return false;
}
return true;
}
/* auth_ftp(string user, string password) функция авторизации на ftp сервере,
принемает параметры
$login имя юзера на ftp сервере, $pass пароль юзера на ftp сервере.Возращает true в случае успеха и false при неудаче
*/
function auth_ftp($login,$pass)
{
fwrite($this->sock,'user '.$login."\r\n");
$user=fgets($this->sock);
// print '<b>user:</b> '.$user.'<br>';
if(strpos($user,'331')===false)
{
$this->error=err_auth.', Неправельный логин';
return false;
}
fwrite($this->sock,'pass '.$pass."\r\n");
$parol=fgets($this->sock);
// print '<b>pass:</b> '.$parol.'<br>';
if(strpos($parol,'230')===false)
{
$this->error=err_auth.', Неправельный пароль';
return false;
}
return true;
}

/* pasv_ftp(bool) функция вкл./выкл. пассивного режима,принемает true - проверяет вкл. или выкл. пассивный режим и есле отключен то устанавливает его,false - проверяет вкл. или выкл. ли пассивный режим и вслучие есле вкл. то выкл. его.Возращает true вслучие успеха,и false в случие неудачи */

function pasv_ftp($mode)
{
if($mode)
{
if(!$this->pasv)
{
fwrite($this->sock,'pasv'."\r\n");
$read=fgets($this->sock);
// print '<b>pasv:</b> '.$read.'<br>';
if(strpos($read,'227')===false)
{
$this->error=err_pasv;
return false;
}
preg_match('|\(([^)]+)\)|sU',$read,$res);
$ex=explode(',',$res[1]);
$port=$ex[4]*256+$ex[5];
$ip=$ex[0].'.'.$ex[1].'.'.$ex[2].'.'.$ex[3];
$this->pasv=$this->socket($ip,$port);
if(!$this->pasv)
{
$this->error=err_pasv.', '.$this->error;
return false;
}
}
}
else
{
if(!$this->pasv)
{
return true;
}
fclose($this->pasv);
$this->pasv=false;
}

return true;
}
/* rawlist_ftp(string dir) Функция для получения подробного списка о содежащих в указанном в $dir удаленном каталоге файлов и каталогов.Возращает массив строк в случие успеха,или false при неудаче */

function rawlist_ftp($dir)
{
if(!$this->pasv_ftp(true))
{
$this->error=err_rawlist.', '.$this->error;
return false;
}
fwrite($this->sock,trim('list '.$dir)."\r\n");
$read=fgets($this->sock);
// print '<b>rawlist:</b> '.$read.'<br>';
if(strpos($read,'150')===false)
{
$this->pasv_ftp(false);
$this->error=err_rawlist;
return false;
}
$list='';
while(($f=fgets($this->pasv))!==false)
{
$list.=$f;
}
$this->pasv_ftp(false);
$read=fgets($this->sock);
// print '<b>rawlist:</b> '.$read.'<br>';
if(strpos($read,'226')===false)
{
$this->error=err_rawlist;
return false;
}

$list=str_replace("\r",'',$list);
return explode("\n",trim($list));
}
/* type_ftp(string type) Функция установки режима передачи.Параметр $type задается предустановленными константами,доступные константы
type_ascii, type_binary, type_l7, type_l8.Возращает true в случие успеха,false при неудаче */

function type_ftp($type)
{
fwrite($this->sock,'type '.$type."\r\n");
$read=fgets($this->sock);
// print '<b>type:</b> '.$read.'<br>';
if(strpos($read,'200')===false)
{
$this->error=err_type;
return false;
}
return true;
}

/* chdir_ftp(string dir) Функция смены текущего рабочего каталога на указанный в $dir.Возращает true при успехе, false при неудаче
 */
function chdir_ftp($dir)
{
fwrite($this->sock,'cwd '.trim($dir)."\r\n");
$read=fgets($this->sock);
// print '<b>chdir:</b> '.$read.'<br>';
if(strpos($read,'250')===false)
{
$this->error=err_chdir;
return false;
}
return true;
}
/* cdup_ftp() Функция делает текущим рабочим каталогом родительский каталог текущего рабочего каталога,некаких параметров функция непринемает.Возращает true при успехе, false при неудаче */

function cdup_ftp()
{
fwrite($this->sock,'cdup'."\r\n");
$read=fgets($this->sock);
// print '<b>cdup:</b> '.$read.'<br>';
if(strpos($read,'250')===false)
{
$this->error=err_cdup;
return false;
}
return true;
}

/* pwd_ftp() Функция для получения текущего рабочего каталога,некаких параметров функция непринемает.Возращает строку с именем удаленного каталога при успехе,или false при неудаче */

function pwd_ftp()
{
fwrite($this->sock,'pwd'."\r\n");
$read=fgets($this->sock);
// print '<b>pwd:</b> '.$read.'<br>';
if(strpos($read,'257')===false)
{
$this->error=err_pwd;
return false;
}
preg_match('|"([^"]+)"|',$read,$m);

return (empty($m[1]) ? substr($read,4) : $m[1]);

}

/* put_ftp(string local_file, string ftp_file, string type) Функция загружает локальный файл на FTP сервер.Параметры: locаl_file - адрес файла на сервере на катором запускается скрипт, ftp_file - имя файла скоторым нада сохранить передоваемый файл на ftp сервере, type - тип передачи данных задается с помащью предустановленных констант (type_binary, type_ascii, type_l7, type_l8) воснавном используются type_ascii, type_binary.Возращает true в случие успеха, и false при неудаче */

function put_ftp($local,$ftp,$type)
{
if(!$this->pasv_ftp(true))
{
$this->error=err_put.', '.$this->error;
return false;
}
if(!$this->type_ftp($type))
{
$this->pasv_ftp(false);
$this->error=err_put.', '.$this->error;
return false;
}
if(!file_exists($local))
{
$this->pasv_ftp(false);
$this->error=err_put.', Заданный файл несуществует';
return false;
}
fwrite($this->sock,'stor '.trim($ftp)."\r\n");
$read=fgets($this->sock);
// print '<b>put:</b> '.$read.'<br>';
if(strpos($read,'150')===false)
{
$this->pasv_ftp(false);
$this->error=err_put;
return false;
}
fwrite($this->pasv,file_get_contents($local));
$this->pasv_ftp(false);
$read=fgets($this->sock);
// print '<b>put:</b> '.$read.'<br>';
if(strpos($read,'226')===false)
{
$this->error=err_put;
return false;
}
return true;
}

/* get_ftp(string local_file, string ftp_file, string type) Функция загрузки файла с FTP сервер на локальный.Параметры: local_file - имя файла с каторым нада сохранить полученный файл,есле этому памаметру передать пустое значение то функция возратит строку содержащию полученный файл, ftp_file - имя файла на ftp сервере который нада загрузить, typе - устонавливает режим передачи,задается с помащью предустановленных констант (type_binary, type_ascii, type_l7, type_l8) воснавном используются type_ascii, type_binary.Возращает true при успехе,и false при неудаче, или сам файл есле в параметре local_file переданно  пустое значение */

function get_ftp($local,$ftp,$type)
{
if(!$this->pasv_ftp(true))
{
$this->error=err_get.', '.$this->error;
return false;
}
if(!$this->type_ftp($type))
{
$this->pasv_ftp(false);
$this->error=err_get.', '.$this->error;
return false;
}
fwrite($this->sock,'retr '.trim($ftp)."\r\n");
$read=fgets($this->sock);
// print '<b>get:</b> '.$read.'<br>';
if(strpos($read,'150')===false)
{
$this->error=err_get.', '.$this->error;
return false;
}
$file='';
while(($s=fgets($this->pasv)))
{
$file.=$s;
}
$this->pasv_ftp(false);
$read=fgets($this->sock);
// print '<b>get:</b> '.$read.'<br>';
if(strpos($read,'226')===false)
{
$this->pasv_ftp(false);
$this->error=err_get;
return false;
}
if(empty($local))
{
return $file;
}
else
{
$fp=fopen($local,'w');
if($fp===false)
{
$this->error=err_get.', Ошибка при сохранении файла';
return false;
}
chmod($local,0666);
fwrite($fp,$file);
fclose($fp);
chmod($local,0644);
return true;
}
}

/* mkdir_ftp(string dir) Функция создает указанный в параметре dir каталог на ftp сервере.Возращает truе при успехе,и false при неудаче */

function mkdir_ftp($dir)
{
fwrite($this->sock,'mkd '.$dir."\r\n");
$read=fgets($this->sock);
// print '<b>mkdir:</b> '.$read.'<br>';
if(strpos($read,'257')===false)
{
$this->error=err_mkdir;
return false;
}
return true;
}

/* rmdir_ftp(string dir) Функция удаляет указанный в параметре dir каталог на ftp сервере */


function rmdir_ftp($dir)
{
fwrite($this->sock,'rmd '.$dir."\r\n");
$read=fgets($this->sock);
// print '<b>rmdir:</b> '.$read.'<br>';
if(strpos($read,'250')===false)
{
$this->error=err_rmdir;
return false;
}
return true;
}

/* rename_ftp(string from, string to) Функция переименовывает(или перемещает) файл на ftp сервере.Параметры: from - имя файла который нада переименовать, to - имя файла в каторое нада переименовать.Возращает true при успехе,и false при неудаче */

function rename_ftp($rnfr,$rnto)
{
fwrite($this->sock,'rnfr '.$rnfr."\r\n");
$read=fgets($this->sock);
// print '<b>rename:</b> '.$read.'<br>';
if(strpos($read,'350')===false)
{
$this->error=err_rename.', Ошибка задания пораметра rename from';
return false;
}
fwrite($this->sock,'rnto '.$rnto."\r\n");
$read=fgets($this->sock);
// print '<b>rename:</b> '.$read.'<br>';
if(strpos($read,'250')===false)
{
$this->error=err_rename.', Ошибка задания параметра rename to';
return false;
}
return true;
}

/* delete_ftp(string file) Функция удаляет указанный в параметре file файл на ftp сервере.Возращает true при успехе,и falsе при неудаче */

function delete_ftp($file)
{
fwrite($this->sock,'dele '.$file."\r\n");
$read=fgets($this->sock);
// print '<b>delete:</b> '.$read.'<br>';
if(strpos($read,'250')===false)
{
$this->error=err_delete;
return false;
}
return true;
}

/* site_ftp(string command) Функция для отправки спецефических команд операционной системы типа chmod.Возращает true при успехе, и false при неудаче */

function site_ftp($param)
{
fwrite($this->sock,'site '.$param."\r\n");
$read=fgets($this->sock);
// print '<b>site:</b> '.$read.'<br>';
if(strpos($read,'200')===false)
{
$this->error=err_site.', Ошибка выпалнения команды "'.$param.'"';
return false;
}
return true;
}

/* chmod_ftp(string ftp_file, int chmod) Функция изменяет указанному в параметре ftp_file файлу на ftp сервере прова доступа на указанный в параметре chmod.Возращает true при успехе,и false при неудаче */
 
function chmod_ftp($file,$chmod)
{
$idf=$this->site_ftp('chmod '.$chmod.' '.$file."\r\n");
if($idf===false)
{
$this->error=err_chmod.', '.$this->error;
return false;
}
return true;
}

/* systype_ftp() Функция для получения типа системы сервера.Некаких параметров непринемает.Возращает страку содержащию тип системы при удаче,и false при неудаче */

function systype_ftp()
{
fwrite($this->sock,'syst'."\r\n");
$read=fgets($this->sock);
// print '<b>system:</b> '.$read.'<br>';
preg_match('/(unix|windows)/i',$read,$platf);
return strtolower($platf[1]);
}

/* mdtm_ftp(string ftp_file) Функция для получени времени последней модификации файла на ftp серве указанного в параметре ftp_file.Возращает при удаче массив чисел означающий дату и время модифекации файла,и false при неудаче */

function mdtm_ftp($file)
{
fwrite($this->sock,'mdtm '.$file."\r\n");
$read=fgets($this->sock);
// print '<b>mdtm:</b> '.$read.'<br>';
if(strpos($read,'213')===false)
{
$this->error=err_mdtm;
return false;
}
list($kod,$vremya)=explode(' ',$read);
if(strlen(trim($vremya))==14)
{
preg_match('|^([0-9]{4}+)([0-9]{2}+)([0-9]{2}+)([0-9]{2}+)([0-9]{2}+)([0-9]{2})|',trim($vremya),$time);
return array('year'=>$time[1],'mon'=>$time[2],'mday'=>$time[3],'hours'=>$time[4],'minutes'=>$time[5],'seconds'=>$time[6]);
}
return $vremya;
}

/* size_ftp(string ftp_file) Функция для получения размера указанного в параметре ftp_file файла на ftp сервере.Возращает при успехе число означаещее размер файла в байтах,и false при неудаче */

function size_ftp($file)
{
$this->type_ftp(type_image);
fwrite($this->sock,'size '.$file."\r\n");
$read=fgets($this->sock);
print '<b>size:</b> '.$read.'<br>';
if(strpos($read,'213')===false)
{
$this->error=err_size;
return false;
}
list($kod,$size)=explode(' ',$read);
return trim($size);
}

/* quit_ftp() Функция закрытия ftp соединения.Некаких параметров непринемает,нечего невозращает */

function quit_ftp()
{
fwrite($this->sock,'quit'."\r\n");
fclose($this->sock);
return;
}
}
?>