Source code for file /joomla/client/ftp.php
Documentation is available at ftp.php
* @version $Id: ftp.php 6671 2007-02-18 23:44:27Z friesengeist $
* @package Joomla.Framework
* @copyright Copyright (C) 2005 - 2007 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software and parts of it may contain or be derived from the
* GNU General Public License or other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
// Check to ensure this file is within the rest of the framework
* - 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
// Is FTP extension loaded? If not try to load it
define('FTP_NATIVE', (function_exists('ftp_connect'))?
1 :
0);
* @package Joomla.Framework
* Server connection resource
* Data port connection resource
* Passive connection information
* Array to hold ascii format file extensions
var $_autoAscii =
array ("asp", "bat", "c", "cpp", "csv", "h", "htm", "html", "shtml", "ini", "inc", "log", "php", "php3", "pl", "perl", "sh", "sql", "txt", "xhtml", "xml");
* Array to hold native line ending characters
var $_lineEndings =
array ('UNIX' =>
"\n", 'MAC' =>
"\r", 'WIN' =>
"\r\n");
* JFTP object constructor
* @param array $options Associative array of options to set
// If default transfer type is no set, set it to autoascii detect
if (!isset
($options['type'])) {
// Import the generic buffer stream handler
jimport('joomla.utilities.buffer');
// Register faked "destructor" in PHP4 to close all connections we might have made
* Closes an existing connection, if we have one
* Returns a reference to the global FTP connector object, only creating it
* if it doesn't already exist.
* This method must be invoked as:
* <pre> $ftp = &JFTP::getInstance($host);</pre>
* 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 JFTP The FTP Client object.
function &getInstance($host =
'127.0.0.1', $port =
'21', $options =
null, $user =
null, $pass =
null)
static $instances =
array();
$signature =
$user.
':'.
$pass.
'@'.
$host.
":".
$port;
// Create a new instance, or set the options of an existing one
if (!isset
($instances[$signature]) ||
!is_object($instances[$signature])) {
$instances[$signature] =
new JFTP($options);
$instances[$signature]->setOptions($options);
// Connect to the server, and login, if requested
$return =
$instances[$signature]->connect($host, $port);
if ($return &&
$user !==
null &&
$pass !==
null) {
$instances[$signature]->login($user, $pass);
return $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
function connect($host =
'127.0.0.1', $port =
21) {
// If already connected, return
// If native FTP support is enabled lets use it...
$this->_conn =
@ftp_connect($host, $port, $this->_timeout);
if ($this->_conn ===
false) {
JError::raiseWarning('30', 'JFTP::connect: Could not connect to host "'.
$host.
'" on port '.
$port);
// Set the timeout for this connection
// Connect to the FTP server.
$this->_conn =
@ fsockopen($host, $port, $errno, $err, $this->_timeout);
JError::raiseWarning('30', 'JFTP::connect: Could not connect to host "'.
$host.
'" on port '.
$port, 'Socket error number '.
$errno.
' and error message: '.
$err);
// Set the timeout for this connection
// Check for welcome response code
if (!$this->_verifyResponse(220)) {
JError::raiseWarning('35', 'JFTP::connect: Bad response', 'Server response: '.
$this->_response.
' [Expected: 220]');
* 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
// If native FTP support is enabled lets use it...
if (@ftp_login($this->_conn, $user, $pass) ===
false) {
if (!$this->_putCmd('USER '.
$user, array(331, 503))) {
JError::raiseWarning('33', 'JFTP::login: Bad Username', 'Server response: '.
$this->_response.
' [Expected: 331] Username sent: '.
$user );
// 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 lets use it...
if (($ret =
@ftp_pwd($this->_conn)) ===
false) {
// Send print working directory command and verify success
if (!$this->_putCmd('PWD', 257)) {
JError::raiseWarning('35', 'JFTP::pwd: Bad response', 'Server response: '.
$this->_response.
' [Expected: 257]' );
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...
// Send print working directory command and verify success
if (!$this->_putCmd('SYST', 215)) {
JError::raiseWarning('35', 'JFTP::syst: Bad response', 'Server response: '.
$this->_response.
' [Expected: 215]' );
// 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
// If native FTP support is enabled lets use it...
if (@ftp_chdir($this->_conn, $path) ===
false) {
// Send change directory command and verify success
if (!$this->_putCmd('CWD '.
$path, 250)) {
JError::raiseWarning('35', 'JFTP::chdir: Bad response', 'Server response: '.
$this->_response.
' [Expected: 250] Path sent: '.
$path );
* Method to reinitialize 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 lets use it...
if (@ftp_site($this->_conn, 'REIN') ===
false) {
// Send reinitialize command to the server
if (!$this->_putCmd('REIN', 220)) {
JError::raiseWarning('35', 'JFTP::reinit: Bad response', 'Server response: '.
$this->_response.
' [Expected: 220]' );
* 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
// If native FTP support is enabled lets use it...
if (@ftp_rename($this->_conn, $from, $to) ===
false) {
// Send rename from command to the server
if (!$this->_putCmd('RNFR '.
$from, 350)) {
JError::raiseWarning('35', 'JFTP::rename: Bad response', 'Server response: '.
$this->_response.
' [Expected: 320] From path sent: '.
$from );
// Send rename to command to the server
if (!$this->_putCmd('RNTO '.
$to, 250)) {
JError::raiseWarning('35', 'JFTP::rename: Bad response', 'Server response: '.
$this->_response.
' [Expected: 250] To path sent: '.
$to );
* Method to change mode for a path on the FTP server
* @param string $path Path to change mode on
* @param string/int $mode Octal value to change mode to, e.g. '0777', 0777 or 511
* @return boolean True if successful
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 lets use it...
if (@ftp_site($this->_conn, 'CHMOD '.
$mode.
' '.
$path) ===
false) {
// Send change mode command and verify success [must convert mode from octal]
if (!$this->_putCmd('SITE CHMOD '.
$mode.
' '.
$path, array(200, 250))) {
JError::raiseWarning('35', 'JFTP::chmod: Bad response', 'Server response: '.
$this->_response.
' [Expected: 200 or 250] Path sent: '.
$path.
' Mode sent: '.
$mode);
* 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 lets use it...
if (@ftp_rmdir($this->_conn, $path) ===
false) {
// 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)) {
JError::raiseWarning('35', 'JFTP::delete: Bad response', 'Server response: '.
$this->_response.
' [Expected: 250] Path sent: '.
$path );
* Method to create a directory on the FTP server
* @param string $path Directory to create
* @return boolean True if successful
// If native FTP support is enabled lets use it...
if (@ftp_mkdir($this->_conn, $path) ===
false) {
// Send change directory command and verify success
if (!$this->_putCmd('MKD '.
$path, 257)) {
JError::raiseWarning('35', 'JFTP::mkdir: Bad response', 'Server response: '.
$this->_response.
' [Expected: 257] Path sent: '.
$path );
* Method to restart data transfer at a given byte
* @param int $point Byte to restart transfer at
* @return boolean True if successful
// If native FTP support is enabled lets use it...
if (@ftp_site($this->_conn, 'REST '.
$point) ===
false) {
// Send restart command and verify success
if (!$this->_putCmd('REST '.
$point, 350)) {
JError::raiseWarning('35', 'JFTP::restart: Bad response', 'Server response: '.
$this->_response.
' [Expected: 350] Restart point sent: '.
$point );
* 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 lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
$buffer =
fopen('buffer://tmp', 'r');
if (!$this->_passive()) {
if (!$this->_putCmd('STOR '.
$path, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::create: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$path );
// To create a zero byte upload close the data port connection
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::create: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$path );
* 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
function read($remote, &$buffer) {
$mode =
$this->_findMode($remote);
// If native FTP support is enabled lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
$tmp =
fopen('buffer://tmp', 'br+');
if (@ftp_fget($this->_conn, $tmp, $remote, $mode) ===
false) {
// Read tmp buffer contents
$buffer .=
fread($tmp, 8192);
if (!$this->_passive()) {
if (!$this->_putCmd('RETR '.
$remote, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::read: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$remote );
// 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
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::read: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$remote );
* Method to get a file from the FTP server and save it to a local file
* @param string $local Path to local file to save remote file as
* @param string $remote Path to remote file to get on the FTP server
* @return boolean True if successful
function get($local, $remote) {
$mode =
$this->_findMode($remote);
// If native FTP support is enabled lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
if (@ftp_get($this->_conn, $local, $remote, $mode) ===
false) {
// Check to see if the local file can be opened for writing
$fp =
fopen($local, "wb");
JError::raiseWarning('38', 'JFTP::get: Unable to open local file for writing', 'Local path: '.
$local );
if (!$this->_passive()) {
if (!$this->_putCmd('RETR '.
$remote, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::get: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$remote );
// Read data from data port connection and add to the buffer
while (!feof($this->_dataconn)) {
$buffer =
fread($this->_dataconn, 4096);
$ret =
fwrite($fp, $buffer, 4096);
// Close the data port connection and file pointer
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::get: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$remote );
* 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
function store($local, $remote =
null) {
// If remote file not given, use the filename of the local file in the current
$mode =
$this->_findMode($remote);
// If native FTP support is enabled lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
if (@ftp_put($this->_conn, $remote, $local, $mode) ===
false) {
// Check to see if the local file exists and open for reading if so
$fp =
fopen($local, "rb");
JError::raiseWarning('38', 'JFTP::store: Unable to open local file for reading', 'Local path: '.
$local );
JError::raiseWarning('38', 'JFTP::store: Unable to find local path', 'Local path: '.
$local );
if (!$this->_passive()) {
// Send store command to the FTP server
if (!$this->_putCmd('STOR '.
$remote, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::store: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$remote );
// Do actual file transfer, read local file and write to data port connection
$line =
fread($fp, 4096);
if (($result =
@ fwrite($this->_dataconn, $line)) ===
false) {
$line =
substr($line, $result);
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::store: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$remote );
* 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
function write($remote, $buffer) {
$mode =
$this->_findMode($remote);
// If native FTP support is enabled lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
$tmp =
fopen('buffer://tmp', 'br+');
if (@ftp_fput($this->_conn, $remote, $tmp, $mode) ===
false) {
// First we need to set the transfer mode
if (!$this->_passive()) {
// Send store command to the FTP server
if (!$this->_putCmd('STOR '.
$remote, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::write: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$remote );
// Write buffer to the data connection port
if (($result =
@ fwrite($this->_dataconn, $buffer)) ===
false) {
$buffer =
substr($buffer, $result);
// Close the data connection port [Data transfer complete]
// Verify that the server recieved the transfer
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::write: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$remote );
* Method to list the file/folder names of the contents of a directory on the FTP server
* @param string $path Path local file to store on the FTP server
* @return string Directory listing
// If native FTP support is enabled lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
if (($list =
@ftp_nlist($this->_conn,$path)) ===
false) {
* If a path exists, prepend a space
if (!$this->_passive()) {
if (!$this->_putCmd('NLST'.
$path, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::listNames: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$path );
// Read in the file listing.
while (!feof($this->_dataconn)) {
$data .=
fread($this->_dataconn, 4096);
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::listNames: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$path );
* Method to list the contents of a directory on the FTP server
* @param string $path Path local file to store on the FTP server
* @param string $type Return type [raw|all|folders|files]
* @param boolean $search Recursively search subdirectories
* @return mixed : if $type is raw: string Directory listing, otherwise array of string with file-names
// TODO: Deal with recurse -- nightmare
// For now we will just set it to false
// If native FTP support is enabled lets use it...
if (@ftp_pasv($this->_conn, true) ===
false) {
if (($contents =
@ftp_rawlist($this->_conn, $path)) ===
false) {
if (!$this->_passive()) {
// If a path exists, prepend a space
// Request the file listing
if (!$this->_putCmd(($recurse ==
true) ?
'LIST -R' :
'LIST'.
$path, array (150, 125))) {
JError::raiseWarning('35', 'JFTP::listDetails: Bad response', 'Server response: '.
$this->_response.
' [Expected: 150 or 125] Path sent: '.
$path );
// Read in the file listing.
while (!feof($this->_dataconn)) {
$data .=
fread($this->_dataconn, 4096);
if (!$this->_verifyResponse(226)) {
JError::raiseWarning('37', 'JFTP::listDetails: Transfer Failed', 'Server response: '.
$this->_response.
' [Expected: 226] Path sent: '.
$path );
// If only raw output is requested we are done
// If we received the listing of an emtpy directory, we are done as well
if (empty($contents[0])) {
// Workaround for a bug in some FTP servers, which are sending an empty array instead of failing for invalid paths
// Regular expressions for the directory listing parsing
$regexps['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}) (.+)';
$regexps['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}) (.+)';
$regexps['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) {
if (ereg($v, $contents[0])) {
JError::raiseWarning('SOME_ERROR_CODE', 'JFTP::listDetails: Unrecognized directory listing format' );
* Here is where it is going to get dirty....
foreach ($contents as $file) {
if (ereg($regexp, $file, $regs)) {
$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) {
$dir_list[] =
$tmp_array;
elseif ($osType ==
'MAC') {
foreach ($contents as $file) {
if (ereg($regexp, $file, $regs)) {
$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) {
$dir_list[] =
$tmp_array;
foreach ($contents as $file) {
if (ereg($regexp, $file, $regs)) {
$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) {
$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 $expected Integer response code or array of integer response codes
* @return boolean True if command executed successfully
function _putCmd($cmd, $expectedResponse) {
// Make sure we have a connection to the server
// Send the command to the server
if (!fwrite($this->_conn, $cmd.
"\r\n")) {
return $this->_verifyResponse($expectedResponse);
* 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
function _verifyResponse($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);
// Catch a timeout or bad response
JError::raiseWarning('SOME_ERROR_CODE', 'JFTP::_verifyResponse: Timeout or unrecognized response while waiting for a response from the server', 'Server response: '.
$this->_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
// 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);
// Catch a timeout or bad response
JError::raiseWarning('SOME_ERROR_CODE', 'JFTP::_passive: Timeout or unrecognized response while waiting for a response from the server', 'Server response: '.
$this->_response);
// Separate the code from the message
$responseCode =
$parts[1];
$responseMsg =
$parts[0];
// If it's not 227, we weren't given an IP and port, which means it failed.
if ($responseCode !=
'227') {
JError::raiseWarning('36', 'JFTP::_passive: Unable to obtain IP and port for data transfer', 'Server response: '.
$responseMsg );
// Snatch the IP and port information, or die horribly trying...
if (preg_match('~\((\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))\)~', $responseMsg, $match) ==
0) {
JError::raiseWarning('36', 'JFTP::_passive: IP and port for data transfer not valid', 'Server response: '.
$responseMsg );
// 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);
JError::raiseWarning('30', 'JFTP::_passive: Could not connect to host '.
$this->_pasv['ip'].
' on port '.
$this->_pasv['port'].
'. Socket error number '.
$errno.
' and error message: '.
$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]
function _findMode($fileName) {
$dot =
strrpos($fileName, '.') +
1;
$ext =
substr($fileName, $dot);
if (in_array($ext, $this->_autoAscii)) {
* @param int $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
if (!$this->_putCmd("TYPE I", 200)) {
JError::raiseWarning('35', 'JFTP::_mode: Bad response', 'Server response: '.
$this->_response.
' [Expected: 200] Mode sent: Binary' );
if (!$this->_putCmd("TYPE A", 200)) {
JError::raiseWarning('35', 'JFTP::_mode: Bad response', 'Server response: '.
$this->_response.
' [Expected: 200] Mode sent: Ascii' );