I am not sure if this is what you are looking for because you did not say what server this would be run on. If it is your server then the client FTP login info will be hidden from the customer but if it is on the customers server then you will have to use something like Zend Encoder or Ioncube to encrypt the source to hide the login.
I have built my own client for my CMS around this code because I wanted something to that goes back to PHP 4.0.6 (does not implement FTP functions) so if you have any questions just post them here.
I am posting this rather than linking because the code is very difficult to find on the net.
Code: Select all
<?php
/*********************************************************************
*
* PHP FTP Client Class By TOMO ( groove@spencernetwork.org )
*
* - Version 0.12 (2002/01/11)
* - This script is free but without any warranty.
* - You can freely copy, use, modify or redistribute this script
* for any purpose.
* - But please do not erase this information!!.
*
********************************************************************/
/*********************************************************************
Example
$ftp_host = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
$ftp = new ftp();
$ftp->debug = TRUE;
if (!$ftp->ftp_connect($ftp_host)) {
die("Cannot connect\n");
}
if (!$ftp->ftp_login($ftp_user, $ftp_pass)) {
$ftp->ftp_quit();
die("Login failed\n");
}
if ($pwd = $ftp->ftp_pwd()) {
echo "Current directory is ".$pwd."\n";
} else {
$ftp->ftp_quit();
die("Error!!\n");
}
if ($sys = $ftp->ftp_systype()) {
echo "Remote system is ".$sys."\n";
} else {
$ftp->ftp_quit();
die("Error!!\n");
}
$local_filename = "local.file";
$remote_filename = "remote.file";
if ($ftp->ftp_file_exists($remote_filename) == 1) {
$ftp->ftp_quit();
die($remote_filename." already exists\n");
}
if ($ftp->ftp_put($remote_filename, $local_filename)) {
echo $local_filename." has been uploaded as ".$remote_filename."\n";
} else {
$ftp->ftp_quit();
die("Error!!\n");
}
$ftp->ftp_quit();
*********************************************************************/
/*********************************************************************
List of available functions
ftp_connect($server, $port = 21)
ftp_login($user, $pass)
ftp_pwd()
ftp_size($pathname)
ftp_mdtm($pathname)
ftp_systype()
ftp_cdup()
ftp_chdir($pathname)
ftp_delete($pathname)
ftp_rmdir($pathname)
ftp_mkdir($pathname)
ftp_file_exists($pathname)
ftp_rename($from, $to)
ftp_nlist($arg = "", $pathname = "")
ftp_rawlist($pathname = "")
ftp_get($localfile, $remotefile, $mode = 1)
ftp_put($remotefile, $localfile, $mode = 1)
ftp_site($command)
ftp_quit()
*********************************************************************/
class ftp
{
/* Public variables */
var $debug;
var $umask;
var $timeout;
/* Private variables */
var $ftp_sock;
var $ftp_resp;
/* Constractor */
function ftp()
{
$this->debug = FALSE;
$this->umask = 0022;
$this->timeout = 30;
if (!defined("FTP_BINARY")) {
define("FTP_BINARY", 1);
}
if (!defined("FTP_ASCII")) {
define("FTP_ASCII", 0);
}
$this->ftp_resp = "";
}
/* Public functions */
function ftp_connect($server, $port = 21)
{
$this->ftp_debug("Trying to ".$server.":".$port." ...\n");
$this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout);
if (!$this->ftp_sock || !$this->ftp_ok()) {
$this->ftp_debug("Error : Cannot connect to remote host "".$server.":".$port.""\n");
$this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n");
return FALSE;
}
$this->ftp_debug("Connected to remote host "".$server.":".$port.""\n");
return TRUE;
}
function ftp_login($user, $pass)
{
$this->ftp_putcmd("USER", $user);
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : USER command failed\n");
return FALSE;
}
$this->ftp_putcmd("PASS", $pass);
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : PASS command failed\n");
return FALSE;
}
$this->ftp_debug("Authentication succeeded\n");
return TRUE;
}
function ftp_pwd()
{
$this->ftp_putcmd("PWD");
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : PWD command failed\n");
return FALSE;
}
return ereg_replace("^[0-9]{3} "(.+)" .+\r\n", "\\1", $this->ftp_resp);
}
function ftp_size($pathname)
{
$this->ftp_putcmd("SIZE", $pathname);
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : SIZE command failed\n");
return -1;
}
return ereg_replace("^[0-9]{3} ([0-9]+)\r\n", "\\1", $this->ftp_resp);
}
function ftp_mdtm($pathname)
{
$this->ftp_putcmd("MDTM", $pathname);
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : MDTM command failed\n");
return -1;
}
$mdtm = ereg_replace("^[0-9]{3} ([0-9]+)\r\n", "\\1", $this->ftp_resp);
$date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
return $timestamp;
}
function ftp_systype()
{
$this->ftp_putcmd("SYST");
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : SYST command failed\n");
return FALSE;
}
$DATA = explode(" ", $this->ftp_resp);
return $DATA[1];
}
function ftp_cdup()
{
$this->ftp_putcmd("CDUP");
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : CDUP command failed\n");
}
return $response;
}
function ftp_chdir($pathname)
{
$this->ftp_putcmd("CWD", $pathname);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : CWD command failed\n");
}
return $response;
}
function ftp_delete($pathname)
{
$this->ftp_putcmd("DELE", $pathname);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : DELE command failed\n");
}
return $response;
}
function ftp_rmdir($pathname)
{
$this->ftp_putcmd("RMD", $pathname);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : RMD command failed\n");
}
return $response;
}
function ftp_mkdir($pathname)
{
$this->ftp_putcmd("MKD", $pathname);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : MKD command failed\n");
}
return $response;
}
function ftp_file_exists($pathname)
{
if (!($remote_list = $this->ftp_nlist("-a"))) {
$this->ftp_debug("Error : Cannot get remote file list\n");
return -1;
}
reset($remote_list);
while (list(,$value) = each($remote_list)) {
if ($value == $pathname) {
$this->ftp_debug("Remote file ".$pathname." exists\n");
return 1;
}
}
$this->ftp_debug("Remote file ".$pathname." does not exist\n");
return 0;
}
function ftp_rename($from, $to)
{
$this->ftp_putcmd("RNFR", $from);
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : RNFR command failed\n");
return FALSE;
}
$this->ftp_putcmd("RNTO", $to);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : RNTO command failed\n");
}
return $response;
}
function ftp_nlist($arg = "", $pathname = "")
{
if (!($string = $this->ftp_pasv())) {
return FALSE;
}
if ($arg == "") {
$nlst = "NLST";
} else {
$nlst = "NLST ".$arg;
}
$this->ftp_putcmd($nlst, $pathname);
$sock_data = $this->ftp_open_data_connection($string);
if (!$sock_data || !$this->ftp_ok()) {
$this->ftp_debug("Error : Cannot connect to remote host\n");
$this->ftp_debug("Error : NLST command failed\n");
return FALSE;
}
$this->ftp_debug("Connected to remote host\n");
while (!feof($sock_data)) {
$list[] = ereg_replace("[\r\n]", "", fgets($sock_data, 512));
}
$this->ftp_close_data_connection($sock_data);
$this->ftp_debug(implode("\n", $list));
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : NLST command failed\n");
return FALSE;
}
return $list;
}
function ftp_rawlist($pathname = "")
{
if (!($string = $this->ftp_pasv())) {
return FALSE;
}
$this->ftp_putcmd("LIST", $pathname);
$sock_data = $this->ftp_open_data_connection($string);
if (!$sock_data || !$this->ftp_ok()) {
$this->ftp_debug("Error : Cannot connect to remote host\n");
$this->ftp_debug("Error : LIST command failed\n");
return FALSE;
}
$this->ftp_debug("Connected to remote host\n");
while (!feof($sock_data)) {
$list[] = ereg_replace("[\r\n]", "", fgets($sock_data, 512));
}
$this->ftp_debug(implode("\n", $list));
$this->ftp_close_data_connection($sock_data);
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : LIST command failed\n");
return FALSE;
}
return $list;
}
function ftp_get($localfile, $remotefile, $mode = 1)
{
umask($this->umask);
if (@file_exists($localfile)) {
$this->ftp_debug("Warning : local file will be overwritten\n");
}
$fp = @fopen($localfile, "w");
if (!$fp) {
$this->ftp_debug("Error : Cannot create "".$localfile.""");
$this->ftp_debug("Error : GET command failed\n");
return FALSE;
}
if (!$this->ftp_type($mode)) {
$this->ftp_debug("Error : GET command failed\n");
return FALSE;
}
if (!($string = $this->ftp_pasv())) {
$this->ftp_debug("Error : GET command failed\n");
return FALSE;
}
$this->ftp_putcmd("RETR", $remotefile);
$sock_data = $this->ftp_open_data_connection($string);
if (!$sock_data || !$this->ftp_ok()) {
$this->ftp_debug("Error : Cannot connect to remote host\n");
$this->ftp_debug("Error : GET command failed\n");
return FALSE;
}
$this->ftp_debug("Connected to remote host\n");
$this->ftp_debug("Retrieving remote file "".$remotefile."" to local file "".$localfile.""\n");
while (!feof($sock_data)) {
fputs($fp, fread($sock_data, 4096));
}
fclose($fp);
$this->ftp_close_data_connection($sock_data);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : GET command failed\n");
}
return $response;
}
function ftp_put($remotefile, $localfile, $mode = 1)
{
if (!@file_exists($localfile)) {
$this->ftp_debug("Error : No such file or directory "".$localfile.""\n");
$this->ftp_debug("Error : PUT command failed\n");
return FALSE;
}
$fp = @fopen($localfile, "r");
if (!$fp) {
$this->ftp_debug("Error : Cannot read file "".$localfile.""\n");
$this->ftp_debug("Error : PUT command failed\n");
return FALSE;
}
if (!$this->ftp_type($mode)) {
$this->ftp_debug("Error : PUT command failed\n");
return FALSE;
}
if (!($string = $this->ftp_pasv())) {
$this->ftp_debug("Error : PUT command failed\n");
return FALSE;
}
$this->ftp_putcmd("STOR", $remotefile);
$sock_data = $this->ftp_open_data_connection($string);
if (!$sock_data || !$this->ftp_ok()) {
$this->ftp_debug("Error : Cannot connect to remote host\n");
$this->ftp_debug("Error : PUT command failed\n");
return FALSE;
}
$this->ftp_debug("Connected to remote host\n");
$this->ftp_debug("Storing local file "".$localfile."" to remote file "".$remotefile.""\n");
while (!feof($fp)) {
fputs($sock_data, fread($fp, 4096));
}
fclose($fp);
$this->ftp_close_data_connection($sock_data);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : PUT command failed\n");
}
return $response;
}
function ftp_site($command)
{
$this->ftp_putcmd("SITE", $command);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : SITE command failed\n");
}
return $response;
}
function ftp_quit()
{
$this->ftp_putcmd("QUIT");
if (!$this->ftp_ok() || !fclose($this->ftp_sock)) {
$this->ftp_debug("Error : QUIT command failed\n");
return FALSE;
}
$this->ftp_debug("Disconnected from remote host\n");
return TRUE;
}
/* Private Functions */
function ftp_type($mode)
{
if ($mode) {
$type = "I"; //Binary mode
} else {
$type = "A"; //ASCII mode
}
$this->ftp_putcmd("TYPE", $type);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : TYPE command failed\n");
}
return $response;
}
function ftp_port($ip_port)
{
$this->ftp_putcmd("PORT", $ip_port);
$response = $this->ftp_ok();
if (!$response) {
$this->ftp_debug("Error : PORT command failed\n");
}
return $response;
}
function ftp_pasv()
{
$this->ftp_putcmd("PASV");
if (!$this->ftp_ok()) {
$this->ftp_debug("Error : PASV command failed\n");
return FALSE;
}
$ip_port = ereg_replace("^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*\r\n$", "\\1", $this->ftp_resp);
return $ip_port;
}
function ftp_putcmd($cmd, $arg = "")
{
if ($arg != "") {
$cmd = $cmd." ".$arg;
}
fputs($this->ftp_sock, $cmd."\r\n");
$this->ftp_debug("> ".$cmd."\n");
return TRUE;
}
function ftp_ok()
{
$this->ftp_resp = "";
do {
$res = fgets($this->ftp_sock, 512);
$this->ftp_resp .= $res;
} while (substr($res, 3, 1) != " ");
$this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp));
if (!ereg("^[123]", $this->ftp_resp)) {
return FALSE;
}
return TRUE;
}
function ftp_close_data_connection($sock)
{
$this->ftp_debug("Disconnected from remote host\n");
return fclose($sock);
}
function ftp_open_data_connection($ip_port)
{
if (!ereg("[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+", $ip_port)) {
$this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n");
return FALSE;
}
$DATA = explode(",", $ip_port);
$ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3];
$port = $DATA[4]*256 + $DATA[5];
$this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n");
$data_connection = @fsockopen($ipaddr, $port, $errno, $errstr);
if (!$data_connection) {
$this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n");
$this->ftp_debug("Error : ".$errstr." (".$errno.")\n");
return FALSE;
}
return $data_connection;
}
function ftp_debug($message = "")
{
if ($this->debug) {
echo $message;
}
return TRUE;
}
}
?>
?>