Source for file ftp.php
Documentation is available at ftp.php
* @package Joomla.Platform
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
* - 30 : Unable to connect to host
* - 32 : Unable to send command to server
* - 36 : Passive mode failed
* - 37 : Data transfer error
* - 38 : Local filesystem error
define('FTP_NATIVE', (function_exists('ftp_connect')) ?
1 :
0);
* @package Joomla.Platform
* @var resource Socket resource
* @var resource Data port connection resource
private $_dataconn =
null;
* @var array Passive connection information
* @var string Response Message
private $_response =
null;
* @var integer Timeout limit
* @var integer Transfer Type
* @var array Array to hold ascii format file extensions
private $_autoAscii =
array(
* Array to hold native line ending characters
private $_lineEndings =
array('UNIX' =>
"\n", 'WIN' =>
"\r\n");
* @var array JClientFtp instances container.
protected static $instances =
array();
* JClientFtp object constructor
* @param array $options Associative array of options to set
// If default transfer type is not set, set it to autoascii detect
if (!isset
($options['type']))
// Import the generic buffer stream handler
jimport('joomla.utilities.buffer');
// Autoloading fails for JBuffer as the class is used as a stream handler
* JClientFtp object destructor
* Closes an existing connection, if we have one
* Returns the global FTP connector object, only creating it
* if it doesn't already exist.
* You may optionally specify a username and password in the parameters. If you do so,
* you may not login() again with different credentials using the same object.
* If you do not use this option, you must quit() the current connection when you
* are done, to free it for use by others.
* @param string $host Host to connect to
* @param string $port Port to connect to
* @param array $options Array with any of these options: type=>[FTP_AUTOASCII|FTP_ASCII|FTP_BINARY], timeout=>(int)
* @param string $user Username to use for a connection
* @param string $pass Password to use for a connection
* @return JClientFtp The FTP Client object.
public static function getInstance($host =
'127.0.0.1', $port =
'21', array $options =
array(), $user =
null, $pass =
null)
$signature =
$user .
':' .
$pass .
'@' .
$host .
":" .
$port;
// Create a new instance, or set the options of an existing one
if (!isset
(self::$instances[$signature]) ||
!is_object(self::$instances[$signature]))
self::$instances[$signature] =
new static($options);
self::$instances[$signature]->setOptions($options);
// Connect to the server, and login, if requested
if (!self::$instances[$signature]->isConnected())
$return =
self::$instances[$signature]->connect($host, $port);
if ($return &&
$user !==
null &&
$pass !==
null)
self::$instances[$signature]->login($user, $pass);
return self::$instances[$signature];
* @param array $options Associative array of options to set
* @return boolean True if successful
if (isset
($options['type']))
$this->_type =
$options['type'];
if (isset
($options['timeout']))
$this->_timeout =
$options['timeout'];
* Method to connect to a FTP server
* @param string $host Host to connect to [Default: 127.0.0.1]
* @param string $port Port to connect on [Default: port 21]
* @return boolean True if successful
public function connect($host =
'127.0.0.1', $port =
21)
// If already connected, return
// If native FTP support is enabled let's use it...
$this->_conn =
@ftp_connect($host, $port, $this->_timeout);
if ($this->_conn ===
false)
// Set the timeout for this connection
// Connect to the FTP server.
$this->_conn =
@ fsockopen($host, $port, $errno, $err, $this->_timeout);
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_NO_CONNECT_SOCKET', $host, $port, $errno, $err), JLog::WARNING, 'jerror');
// Set the timeout for this connection
// Check for welcome response code
* Method to determine if the object is connected to an FTP server
* @return boolean True if connected
* Method to login to a server once connected
* @param string $user Username to login to the server
* @param string $pass Password to login to the server
* @return boolean True if successful
public function login($user =
'anonymous', $pass =
'jftp@joomla.org')
// If native FTP support is enabled let's use it...
if (@ftp_login($this->_conn, $user, $pass) ===
false)
JLog::add('JFTP::login: Unable to login', JLog::WARNING, 'jerror');
if (!$this->_putCmd('USER ' .
$user, array(331, 503)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_BAD_USERNAME', $this->_response, $user), JLog::WARNING, 'jerror');
// If we are already logged in, continue :)
if ($this->_responseCode ==
503)
if (!$this->_putCmd('PASS ' .
$pass, 230))
* Method to quit and close the connection
* @return boolean True if successful
// If native FTP support is enabled lets use it...
// Logout and close connection
@fwrite($this->_conn, "QUIT\r\n");
* Method to retrieve the current working directory on the FTP server
* @return string Current working directory
// If native FTP support is enabled let's use it...
if (($ret =
@ftp_pwd($this->_conn)) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_PWD_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send print working directory command and verify success
preg_match('/"[^"\r\n]*"/', $this->_response, $match);
// Return the cleaned path
* Method to system string from the FTP server
* @return string System identifier string
// If native FTP support is enabled lets use it...
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_SYS_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send print working directory command and verify success
// Match the system string to an OS
* Method to change the current working directory on the FTP server
* @param string $path Path to change into on the server
* @return boolean True if successful
public function chdir($path)
// If native FTP support is enabled lets use it...
if (@ftp_chdir($this->_conn, $path) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_CHDIR_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send change directory command and verify success
if (!$this->_putCmd('CWD ' .
$path, 250))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_CHDIR_BAD_RESPONSE', $this->_response, $path), JLog::WARNING, 'jerror');
* Method to reinitialise the server, ie. need to login again
* NOTE: This command not available on all servers
* @return boolean True if successful
// If native FTP support is enabled let's use it...
if (@ftp_site($this->_conn, 'REIN') ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_REINIT_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send reinitialise command to the server
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_REINIT_BAD_RESPONSE', $this->_response), JLog::WARNING, 'jerror');
* Method to rename a file/folder on the FTP server
* @param string $from Path to change file/folder from
* @param string $to Path to change file/folder to
* @return boolean True if successful
public function rename($from, $to)
// If native FTP support is enabled let's use it...
if (@ftp_rename($this->_conn, $from, $to) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send rename from command to the server
if (!$this->_putCmd('RNFR ' .
$from, 350))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_FROM', $this->_response, $from), JLog::WARNING, 'jerror');
// Send rename to command to the server
if (!$this->_putCmd('RNTO ' .
$to, 250))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_TO', $this->_response, $to), JLog::WARNING, 'jerror');
* Method to change mode for a path on the FTP server
* @param string $path Path to change mode on
* @param mixed $mode Octal value to change mode to, e.g. '0777', 0777 or 511 (string or integer)
* @return boolean True if successful
public function chmod($path, $mode)
// If no filename is given, we assume the current directory is the target
// Convert the mode to a string
// If native FTP support is enabled let's use it...
if (@ftp_site($this->_conn, 'CHMOD ' .
$mode .
' ' .
$path) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_CHMOD_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send change mode command and verify success [must convert mode from octal]
if (!$this->_putCmd('SITE CHMOD ' .
$mode .
' ' .
$path, array(200, 250)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_CHMOD_BAD_RESPONSE', $this->_response, $path, $mode), JLog::WARNING, 'jerror');
* Method to delete a path [file/folder] on the FTP server
* @param string $path Path to delete
* @return boolean True if successful
// If native FTP support is enabled let's use it...
if (@ftp_rmdir($this->_conn, $path) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_DELETE_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send delete file command and if that doesn't work, try to remove a directory
if (!$this->_putCmd('DELE ' .
$path, 250))
if (!$this->_putCmd('RMD ' .
$path, 250))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_DELETE_BAD_RESPONSE', $this->_response, $path), JLog::WARNING, 'jerror');
* Method to create a directory on the FTP server
* @param string $path Directory to create
* @return boolean True if successful
public function mkdir($path)
// If native FTP support is enabled let's use it...
if (@ftp_mkdir($this->_conn, $path) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_MKDIR_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send change directory command and verify success
if (!$this->_putCmd('MKD ' .
$path, 257))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_MKDIR_BAD_RESPONSE', $this->_response, $path), JLog::WARNING, 'jerror');
* Method to restart data transfer at a given byte
* @param integer $point Byte to restart transfer at
* @return boolean True if successful
// If native FTP support is enabled let's use it...
if (@ftp_site($this->_conn, 'REST ' .
$point) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_RESTART_BAD_RESPONSE_NATIVE'), JLog::WARNING, 'jerror');
// Send restart command and verify success
if (!$this->_putCmd('REST ' .
$point, 350))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_RESTART_BAD_RESPONSE', $this->_response, $point), JLog::WARNING, 'jerror');
* Method to create an empty file on the FTP server
* @param string $path Path local file to store on the FTP server
* @return boolean True if successful
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_PASSIVE'), JLog::WARNING, 'jerror');
$buffer =
fopen('buffer://tmp', 'r');
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_BUFFER'), JLog::WARNING, 'jerror');
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_PASSIVE'), JLog::WARNING, 'jerror');
if (!$this->_putCmd('STOR ' .
$path, array(150, 125)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE', $this->_response, $path), JLog::WARNING, 'jerror');
// To create a zero byte upload close the data port connection
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_TRANSFER', $this->_response, $path), JLog::WARNING, 'jerror');
* Method to read a file from the FTP server's contents into a buffer
* @param string $remote Path to remote file to read on the FTP server
* @param string &$buffer Buffer variable to read file contents into
* @return boolean True if successful
public function read($remote, &$buffer)
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_PASSIVE'), JLog::WARNING, 'jerror');
$tmp =
fopen('buffer://tmp', 'br+');
if (@ftp_fget($this->_conn, $tmp, $remote, $mode) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_BUFFER'), JLog::WARNING, 'jerror');
// Read tmp buffer contents
$buffer .=
fread($tmp, 8192);
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_PASSIVE'), JLog::WARNING, 'jerror');
if (!$this->_putCmd('RETR ' .
$remote, array(150, 125)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE', $this->_response, $remote), JLog::WARNING, 'jerror');
// Read data from data port connection and add to the buffer
while (!feof($this->_dataconn))
$buffer .=
fread($this->_dataconn, 4096);
// Close the data port connection
// Let's try to cleanup some line endings if it is ascii
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_TRANSFER', $this->_response, $remote), JLog::WARNING, 'jerror');
* Method to get a file from the FTP server and save it to a local file
* @param string $local Local path to save remote file to
* @param string $remote Path to remote file to get on the FTP server
* @return boolean True if successful
public function get($local, $remote)
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
if (@ftp_get($this->_conn, $local, $remote, $mode) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE'), JLog::WARNING, 'jerror');
// Check to see if the local file can be opened for writing
$fp =
fopen($local, "wb");
if (!$this->_putCmd('RETR ' .
$remote, array(150, 125)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE_RETR', $this->_response, $remote), JLog::WARNING, 'jerror');
// Read data from data port connection and add to the buffer
while (!feof($this->_dataconn))
$buffer =
fread($this->_dataconn, 4096);
// Close the data port connection and file pointer
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE_TRANSFER', $this->_response, $remote), JLog::WARNING, 'jerror');
* Method to store a file to the FTP server
* @param string $local Path to local file to store on the FTP server
* @param string $remote FTP path to file to create
* @return boolean True if successful
public function store($local, $remote =
null)
// If remote file is not given, use the filename of the local file in the current
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_STORE_PASSIVE'), JLog::WARNING, 'jerror');
if (@ftp_put($this->_conn, $remote, $local, $mode) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE'), JLog::WARNING, 'jerror');
// Check to see if the local file exists and if so open it for reading
$fp =
fopen($local, "rb");
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_STORE_PASSIVE'), JLog::WARNING, 'jerror');
// Send store command to the FTP server
if (!$this->_putCmd('STOR ' .
$remote, array(150, 125)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE_STOR', $this->_response, $remote), JLog::WARNING, 'jerror');
// Do actual file transfer, read local file and write to data port connection
$line =
fread($fp, 4096);
if (($result =
@ fwrite($this->_dataconn, $line)) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_STORE_DATA_PORT'), JLog::WARNING, 'jerror');
$line =
substr($line, $result);
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE_TRANSFER', $this->_response, $remote), JLog::WARNING, 'jerror');
* Method to write a string to the FTP server
* @param string $remote FTP path to file to write to
* @param string $buffer Contents to write to the FTP server
* @return boolean True if successful
public function write($remote, $buffer)
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_WRITE_PASSIVE'), JLog::WARNING, 'jerror');
$tmp =
fopen('buffer://tmp', 'br+');
if (@ftp_fput($this->_conn, $remote, $tmp, $mode) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE'), JLog::WARNING, 'jerror');
// First we need to set the transfer mode
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_WRITE_PASSIVE'), JLog::WARNING, 'jerror');
// Send store command to the FTP server
if (!$this->_putCmd('STOR ' .
$remote, array(150, 125)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE_STOR', $this->_response, $remote), JLog::WARNING, 'jerror');
// Write buffer to the data connection port
if (($result =
@ fwrite($this->_dataconn, $buffer)) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_WRITE_DATA_PORT'), JLog::WARNING, 'jerror');
$buffer =
substr($buffer, $result);
// Close the data connection port [Data transfer complete]
// Verify that the server recieved the transfer
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE_TRANSFER', $this->_response, $remote), JLog::WARNING, 'jerror');
* Method to list the filenames of the contents of a directory on the FTP server
* Note: Some servers also return folder names. However, to be sure to list folders on all
* servers, you should use listDetails() instead if you also need to deal with folders
* @param string $path Path local file to store on the FTP server
* @return string Directory listing
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTNAMES_PASSIVE'), JLog::WARNING, 'jerror');
if (($list =
@ftp_nlist($this->_conn, $path)) ===
false)
// Workaround for empty directories on some servers
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE'), JLog::WARNING, 'jerror');
* If a path exists, prepend a space
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTNAMES_PASSIVE'), JLog::WARNING, 'jerror');
if (!$this->_putCmd('NLST' .
$path, array(150, 125)))
// Workaround for empty directories on some servers
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE_NLST', $this->_response, $path), JLog::WARNING, 'jerror');
// Read in the file listing.
while (!feof($this->_dataconn))
$data .=
fread($this->_dataconn, 4096);
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE_TRANSFER', $this->_response, $path), JLog::WARNING, 'jerror');
$data =
preg_split("/[" .
CRLF .
"]+/", $data, -
1, PREG_SPLIT_NO_EMPTY);
* Method to list the contents of a directory on the FTP server
* @param string $path Path to the local file to be stored on the FTP server
* @param string $type Return type [raw|all|folders|files]
* @return mixed If $type is raw: string Directory listing, otherwise array of string with file-names
public function listDetails($path =
null, $type =
'all')
// TODO: Deal with recurse -- nightmare
// For now we will just set it to false
// If native FTP support is enabled let's use it...
if (@ftp_pasv($this->_conn, true) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_PASSIVE'), JLog::WARNING, 'jerror');
if (($contents =
@ftp_rawlist($this->_conn, $path)) ===
false)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE'), JLog::WARNING, 'jerror');
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_PASSIVE'), JLog::WARNING, 'jerror');
// If a path exists, prepend a space
// Request the file listing
if (!$this->_putCmd(($recurse ==
true) ?
'LIST -R' :
'LIST' .
$path, array(150, 125)))
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE_LIST', $this->_response, $path), JLog::WARNING, 'jerror');
// Read in the file listing.
while (!feof($this->_dataconn))
$data .=
fread($this->_dataconn, 4096);
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE_TRANSFER', $this->_response, $path), JLog::WARNING, 'jerror');
// If only raw output is requested we are done
// If we received the listing of an empty directory, we are done as well
// If the server returned the number of results in the first response, let's dump it
if (!isset
($contents[0]) ||
empty($contents[0]))
// Regular expressions for the directory listing parsing.
'UNIX' =>
'#([-dl][rwxstST-]+).* ([0-9]*) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*)'
.
' ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{1,2}:[0-9]{2})|[0-9]{4}) (.+)#',
'MAC' =>
'#([-dl][rwxstST-]+).* ?([0-9 ]*)?([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*)'
.
' ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)#',
'WIN' =>
'#([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)#'
// Find out the format of the directory listing by matching one of the regexps
foreach ($regexps as $k =>
$v)
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_UNRECOGNISED'), JLog::WARNING, 'jerror');
* Here is where it is going to get dirty....
if ($osType ==
'UNIX' ||
$osType ==
'MAC')
foreach ($contents as $file)
$fType = (int)
strpos("-dl", $regs[1]{0});
// $tmp_array['line'] = $regs[0];
$tmp_array['type'] =
$fType;
$tmp_array['rights'] =
$regs[1];
// $tmp_array['number'] = $regs[2];
$tmp_array['user'] =
$regs[3];
$tmp_array['group'] =
$regs[4];
$tmp_array['size'] =
$regs[5];
$tmp_array['time'] =
$regs[7];
$tmp_array['name'] =
$regs[9];
// If we just want files, do not add a folder
if ($type ==
'files' &&
$tmp_array['type'] ==
1)
// If we just want folders, do not add a file
if ($type ==
'folders' &&
$tmp_array['type'] ==
0)
if (is_array($tmp_array) &&
$tmp_array['name'] !=
'.' &&
$tmp_array['name'] !=
'..')
$dir_list[] =
$tmp_array;
foreach ($contents as $file)
$fType = (int)
($regs[7] ==
'<DIR>');
$timestamp =
strtotime("$regs[3]-$regs[1]-$regs[2] $regs[4]:$regs[5]$regs[6]");
// $tmp_array['line'] = $regs[0];
$tmp_array['type'] =
$fType;
$tmp_array['rights'] =
'';
// $tmp_array['number'] = 0;
$tmp_array['group'] =
'';
$tmp_array['size'] = (int)
$regs[7];
$tmp_array['date'] =
date('m-d', $timestamp);
$tmp_array['time'] =
date('H:i', $timestamp);
$tmp_array['name'] =
$regs[8];
// If we just want files, do not add a folder
if ($type ==
'files' &&
$tmp_array['type'] ==
1)
// If we just want folders, do not add a file
if ($type ==
'folders' &&
$tmp_array['type'] ==
0)
if (is_array($tmp_array) &&
$tmp_array['name'] !=
'.' &&
$tmp_array['name'] !=
'..')
$dir_list[] =
$tmp_array;
* Send command to the FTP server and validate an expected response code
* @param string $cmd Command to send to the FTP server
* @param mixed $expectedResponse Integer response code or array of integer response codes
* @return boolean True if command executed successfully
protected function _putCmd($cmd, $expectedResponse)
// Make sure we have a connection to the server
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_PUTCMD_UNCONNECTED'), JLog::WARNING, 'jerror');
// Send the command to the server
if (!fwrite($this->_conn, $cmd .
"\r\n"))
* Verify the response code from the server and log response if flag is set
* @param mixed $expected Integer response code or array of integer response codes
* @return boolean True if response code from the server is expected
// Wait for a response from the server, but timeout after the set time limit
$endTime =
time() +
$this->_timeout;
$this->_response .=
fgets($this->_conn, 4096);
while (!preg_match("/^([0-9]{3})(-(.*" .
CRLF .
")+\\1)? [^" .
CRLF .
"]+" .
CRLF .
"$/", $this->_response, $parts) &&
time() <
$endTime);
// Catch a timeout or bad response
// Separate the code from the message
$this->_responseCode =
$parts[1];
$this->_responseMsg =
$parts[0];
// Did the server respond with the code we wanted?
if (in_array($this->_responseCode, $expected))
if ($this->_responseCode ==
$expected)
* Set server to passive mode and open a data port connection
* @return boolean True if successful
// Make sure we have a connection to the server
JLog::add(JText::_('JLIB_CLIENT_ERROR_JFTP_PASSIVE_CONNECT_PORT'), JLog::WARNING, 'jerror');
// Request a passive connection - this means, we'll talk to you, you don't talk to us.
@ fwrite($this->_conn, "PASV\r\n");
// Wait for a response from the server, but timeout after the set time limit
$endTime =
time() +
$this->_timeout;
$this->_response .=
fgets($this->_conn, 4096);
while (!preg_match("/^([0-9]{3})(-(.*" .
CRLF .
")+\\1)? [^" .
CRLF .
"]+" .
CRLF .
"$/", $this->_response, $parts) &&
time() <
$endTime);
// Catch a timeout or bad response
// Separate the code from the message
$this->_responseCode =
$parts[1];
$this->_responseMsg =
$parts[0];
// If it's not 227, we weren't given an IP and port, which means it failed.
if ($this->_responseCode !=
'227')
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_PASSIVE_IP_OBTAIN', $this->_responseMsg), JLog::WARNING, 'jerror');
// Snatch the IP and port information, or die horribly trying...
if (preg_match('~\((\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))\)~', $this->_responseMsg, $match) ==
0)
JLog::add(JText::sprintf('JLIB_CLIENT_ERROR_JFTP_PASSIVE_IP_VALID', $this->_responseMsg), JLog::WARNING, 'jerror');
// This is pretty simple - store it for later use ;).
$this->_pasv =
array('ip' =>
$match[1] .
'.' .
$match[2] .
'.' .
$match[3] .
'.' .
$match[4], 'port' =>
$match[5] *
256 +
$match[6]);
// Connect, assuming we've got a connection.
$this->_dataconn =
@fsockopen($this->_pasv['ip'], $this->_pasv['port'], $errno, $err, $this->_timeout);
JText::sprintf('JLIB_CLIENT_ERROR_JFTP_PASSIVE_CONNECT', $this->_pasv['ip'], $this->_pasv['port'], $errno, $err),
// Set the timeout for this connection
* Method to find out the correct transfer mode for a specific file
* @param string $fileName Name of the file
* @return integer Transfer-mode for this filetype [FTP_ASCII|FTP_BINARY]
$dot =
strrpos($fileName, '.') +
1;
$ext =
substr($fileName, $dot);
* @param integer $mode Integer representation of data transfer mode [1:Binary|0:Ascii]
* Defined constants can also be used [FTP_BINARY|FTP_ASCII]
* @return boolean True if successful
protected function _mode($mode)
if (!$this->_putCmd("TYPE I", 200))
if (!$this->_putCmd("TYPE A", 200))
* Deprecated class placeholder. You should use JClientFtp instead.
* @package Joomla.Platform
* @deprecated 12.3 (Platform) & 4.0 (CMS)
* JFTP object constructor
* @param array $options Associative array of options to set
JLog::add('JFTP is deprecated. Use JClientFtp instead.', JLog::WARNING, 'deprecated');
Documentation generated on Tue, 19 Nov 2013 15:03:56 +0100 by phpDocumentor 1.4.3