65.9K
CodeProject 正在变化。 阅读更多。
Home

PHP 中的 FTP 管理脚本。

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2013年8月24日

GPL3

4分钟阅读

viewsIcon

48357

downloadIcon

2136

连接服务器到FTP服务器的PHP应用程序。

介绍 

大家好,我想介绍一下用于连接您的服务器到FTP服务器的PHP函数。我使用PHP函数创建了一个应用程序来实现这个功能。我之前已在一些网站上发布过此应用程序。

 

优点

我想说明它的优势,因为当像“FILEZILLA”这样高级的应用程序可用时,您可能会想这个PHP脚本有什么用。

它有其自身的用途。

  • 它允许您将服务器连接到FTP服务器。
  • 您不希望中间电脑从FTP服务器上传文件到您的服务器。

背景

当我想将文件上传到我的服务器时,产生了使用PHP创建FTP客户端的想法。将文件下载到我的电脑然后再上传到我的服务器并不是一个好方法。

由此产生了创建FTP客户端以帮助连接服务器到FTP服务器的想法。

使用代码

让我们看看如何在PHP中实现此应用程序。

首先,我需要一个存储介质来存储FTP服务器的主机、用户名和密码。使用……

$user   = $_GET['usrname'];
$passwd = $_GET['passwrd'];
$host	 = $_GET['host']; 

我想将变量的值存储在一个介质中。所以我选择了会话cookie来存储变量的值以便以后使用。现在的代码如下所示:

$user = $_COOKIE['ftpuser'];
$passwd = !$_COOKIE['ftppassword']?"":$_COOKIE['ftppassword'];
$host = $_COOKIE['host'];

所以当用户填写表单并提交时,我会这样存储表单的值:

if(isset($_GET['host']) && isset($_GET['usrname']) && isset($_GET['passwrd']))
{
	global $user, $passwd, $host;
	setcookie("ftpuser", $_GET['usrname']);
	setcookie("ftppassword", $_GET['passwrd']);
	setcookie("host", $_GET['host']);	
}

现在让我们检查一下PHP的FTP函数,它将有助于连接FTP服务器。要连接FTP服务器,请使用:$connect = ftp_connect($host);

它将尝试连接到FTP服务器。函数ftp_connect()将返回一个布尔值给变量$connect
如果连接成功,下一步是登录到FTP服务器。要登录到FTP服务器,请使用函数ftp_login()

所以代码将变成:$login = ftp_login($connect, $user, $passwd);
函数ftp_login()将返回一个布尔值给变量$login
接下来是读取FTP服务器上的文件。有两个函数可以列出FTP服务器上的文件:ftp_nlist()ftp_rawlist()

在这里,ftp_rawlist()是更高级的目录列表类型,因为它将返回FTP服务器上文件的几乎所有详细信息。

function dirDetails($directory=".")
{
	global $connect;
	if(is_array($directs=ftp_rawlist($connect, $directory)))
	{
		$prop = array();
		$nl=count($directs);
		foreach($directs as $dirx)
		{
			$chunks = preg_split("/[\s]+/", $dirx, 9);
			list($prop['perm'], $prop['num'], $prop['user'], $prop['group'], $prop['size'], $prop['mon'], $prop['day'], $prop['time']) = $chunks;
			$prop['type']=$chunks[0]{0}==='d'?'Directory':'File';
			$prop['name']=$chunks[8];
			array_splice($chunks, 0, 8);
			$props[implode(" ", $chunks)]=$prop;
		}
		return $props;
	}
}

函数dirDetails()将在我们使用路径作为参数(默认情况下为当前工作目录“.”)调用该函数时读取目录中的文件。

内部函数将根据权限、用户、组、大小(以位为单位)、上次修改日期(月、日、时间)、文件类型和文件名分割ftp_rawlist()的输出。

为了显示FTP服务器上文件和目录的详细信息,使用了下面的函数。

$property = dirDetails($fpath);
foreach($property as $prop)
{
	global $fpath;
	$modified = date("F d Y",ftp_mdtm($connect, $prop['name']));
	if($prop['type']=='Directory')
	{
		print "[ ".$prop["name"]." ]".$prop['type']."".filesizex($prop['size'])."$modified".$prop['perm']."".$prop['user']."".$prop['group']."Rename | Delete";
	}
	else
	{
		print "".$prop['name']."".$prop['type']."".filesizex($prop['size'])."$modified".$prop['perm']."".$prop['user']."".$prop['group']."Download | Rename | Delete";
	}
}

要从FTP服务器下载文件,请使用$down = ftp_get($resource, $fname, $fname, FTP_ASCII); 这里$resource是连接流,第一个$fname表示下载文件的名称,第二个$fname表示远程文件,第三个参数FTP_ASCII表示下载的resumepos。

function download($resource, $fname)
{
	$down = ftp_get($resource, $fname, $fname, FTP_ASCII);
	if($down)
	{
		success("The file ".$fname." downloaded sucessfully");
	}
	else
	{
		failed("The file ".$fname." failed to download");
	}
}

以上代码片段是我使用的确切函数。要从FTP服务器删除文件,您可以使用函数ftp_delete($connect, $file);

function deleteFiled($file, $dire)
{
	global $connect;
	ftp_chdir($connect, $dire);
	$del = ftp_delete($connect, $file);
	if($del)
	{
		success("The file $file deleted sucessfully");
	}
	else {
		failed("The file $file cannot delete");
	}
}

以上代码片段是我用来删除文件的。
要删除目录,您可以简单地调用函数ftp_rmdir($connect, $file);
但是如果目录不为空,则执行将失败。因此,在删除目录之前,您应该删除目标目录中的所有文件和目录。您可以使用递归函数来实现:

function deleteDir($file, $cdir)
{
	global $connect, $fpath;
	$arraay = dirDetails("$fpath/$file");
	ftp_rmdir($connect, $file);
	foreach ($arraay as $key)
	{
		if($key['type']!='Directory')
		{
			deleteFiledd($fpath."/".$file."/".$key['name']);
		}
		else
		{
			deleteDir($fpath."/".$file."/".$key['name']);
		}
	}
	if(ftp_rmdir($connect, $file))
	{
		success("The directory $file has deleted succssfully");
	}
	else 
	{
		failed("The directory $file cannot delete");
	}
}

如果将目录删除设置为用户,则函数deleteDir()将成功删除目录。
要将文件从服务器上传到FTP服务器,PHP函数ftp_put($connect, $file, $file, FTP_ASCII);将有所帮助。第一个$file表示您要给定的远程文件的名称,第二个$file表示服务器上文件的当前名称。
我在应用程序中使用的确切函数是:

function uploadf()
{
	$file=$_GET['upload'];
	global $connect, $host;
	$uploadd = ftp_put($connect, $file, $file, FTP_ASCII);
	if($uploadd)
	{
		success("Successfully uploaded file $file to FTP Server $host");
	}
	else 
	{
		failed("Failed to upload file $file to FTP Server $host");
	}
}

现在我们已经上传、下载和删除了服务器上的文件。现在我们要维护服务器上的文件。我想展示如何重命名服务器上的文件,重命名文件的PHP函数是ftp_rename($resource, $fname, $nfname);

$fname表示文件的当前名称,$nfname表示文件的新的名称。我使用的确切函数是:

function renamef($resource, $fname, $nfname)
{
	$ren = ftp_rename($resource, $fname, $nfname);
	if($ren)
	{
		success("The file ".$fname." renamed sucessfully");
	}
	else
	{
		failed("The file ".$fname." failed to rename");
	}
}

接下来是更改FTP服务器上文件的权限。更改权限的PHP函数是ftp_chmod($connect, $mode, $file);

您可以像这样使用函数ftp_chmod($connect, 0777, "ajithkp.jpg"); 将文件“ajithkp.jpg”的权限更改为模式777。

我使用的确切代码是:

function changeperm()
{
	global $connect, $fpath;
	ftp_chdir($connect, $fpath);
	$mode = $_GET['new_perm'];
	$file = $_GET['fname'];
	$mode = octdec(str_pad($mode, 4, '0', STR_PAD_LEFT));
	if(ftp_chmod($connect, $mode, $file) != FALSE)
		{
			success("The file $file permission changed successfully");
		}
		else 
		{
			failed("The file $file permission cannot changed");
		}
}

我在此应用程序中使用的其他函数如下所示。为了将位大小转换为KB、MB和GB,我使用了下面的函数:

function filesizex($size)
{
    if ($size>=1073741824)$size = round(($size/1073741824) ,2)." GB";
    elseif ($size>=1048576)$size = round(($size/1048576),2)." MB";
    elseif ($size>=1024)$size = round(($size/1024),2)." KB";
    else $size .= " B";
    return $size;
}

要注销当前会话,您需要删除存储在浏览器中的会话cookie。要删除cookie,我使用了PHP函数setcookie("ftpuser", ""); 我使用的确切函数是:

function logout()
{
	setcookie("ftpuser", "");
	setcookie("ftppassword", "");
	setcookie("host", "");
}

更改当前目录:ftp_chdir($connect, $fpath);
获取FTP系统类型:ftp_systype($connect);
获取当前超时:ftp_get_option($connect, FTP_TIMEOUT_SEC);

我希望您喜欢这篇文章和这个应用程序

© . All rights reserved.