12 public function __construct($host,$port = 21,$secure =
false,$timeout = 90){
13 $this->_connection = $secure ? ftp_ssl_connect($host,$port,$timeout) : ftp_connect($host,$port,$timeout);
14 if(!$this->_connection)
throw new \Exception(
"Could not connect to '$host:$port'");
22 if($this->_connection) ftp_close($this->_connection);
23 $this->_connection = null;
26 public function putContents($remote,$data,$mode = FTP_BINARY){
27 $file = fopen(
'php://memory',
'r+');
30 $result = $this->fput($remote,$file,$mode);
36 $file = fopen(
'php://memory',
'r+');
38 if($this->fget($file,$remote,$mode)){
40 while(!feof($file)) $data .= fread($file,1024);
46 public function mkdir($path,$mode = 0777){
48 if($this->nlist($path) ===
false){
49 $this->
mkdir(dirname($path));
50 $result = ftp_mkdir($this->_connection,$path);
51 if($mode) $this->chmod($mode,$path);
57 $current = $this->pwd();
60 if($result = $this->chdir($path)) $this->chdir($current);
62 catch(\Exception $e){}
69 public function find($path,$filters = null,$recursive =
false){
70 if(!$this->
isDir($path))
return false;
71 if(!$filters) $filters = [];
72 if(!array_key_exists(\
Rsi\
File::FIND_FILTER_TYPE,$filters)) $filters[\Rsi\File::FIND_FILTER_TYPE] = \Rsi\File::FIND_TYPE_FILE;
74 if($dir = $this->nlist($path))
foreach($dir as $entry)
if(trim(basename($entry),
'.'))
try{
75 $info = [
'dir' => $is_dir = $this->
isDir($entry)];
76 if($is_dir && $recursive) $files += $this->
find($entry,$filters,$recursive);
77 foreach($filters as $key => $value){
78 if($operator = preg_match(
'/^(\\w+)(\\W+)$/',$key,$match) ? $match[2] : null) $key = $match[1];
79 else $operator =
'==';
81 case \Rsi\File::FIND_FILTER_TYPE:
86 case \Rsi\File::FIND_FILTER_NAME:
89 case \Rsi\File::FIND_FILTER_TIME:
90 if($is_dir || !\
Rsi\
Str::operator($info[$key] = $this->mdtm($entry),$operator,$value))
continue 3;
92 case \Rsi\File::FIND_FILTER_SIZE:
95 case \Rsi\File::FIND_FILTER_FUNC:
96 if(!($info[$key] = call_user_func($value,$$match[0],$info)))
continue 3;
100 $files[$entry] = $info;
102 catch(\Exception $e){}
109 public function dir($path,$pattern = null,$recursive =
false){
110 $filters = [\Rsi\File::FIND_FILTER_TYPE => \Rsi\File::FIND_TYPE_FILE];
111 if($pattern) $filters[\Rsi\File::FIND_FILTER_NAME .
'//'] =
'/^' . strtr(preg_quote($pattern,
'/') .
'$/i',[
'\\*' =>
'.*',
'\\?' =>
'.']);
112 return ($files = $this->
find($path,$filters,$recursive)) ? array_keys($files) : $files;
115 public function __call($func_name,$params){
116 return call_user_func_array(
'ftp_' . \
Rsi\
Str::snake($func_name),array_merge([$this->_connection],$params));
putContents($remote, $data, $mode=FTP_BINARY)
const FIND_FILTER_TYPE
Specify the type (see FIND_TYPE_* constants).
find($path, $filters=null, $recursive=false)
Find and filter files.
getContents($remote, $mode=FTP_BINARY)
dir($path, $pattern=null, $recursive=false)
Find files.
static shorthandBytes($size)
Returns the size in bytes for shorthand notations (e.g.
static operator($ref, $operator,$value, $default=false)
Evaluate an operator between a value and a reference value.
__call($func_name, $params)
static snake($str, $delimiter='_')
Converts a CamelCased string to snake_case.
__construct($host, $port=21, $secure=false, $timeout=90)