文件传输协议FTP (File Transfer Protocol) 是internet文件传送的基础。现在大家也都用它在局域网内传送大文件,而大多数ftp都设有匿名(anonymous)帐号,充分体现了网络资源共享的精神,极大地方便了用户的需求。我们可以通过常见的软件leapftp或者cuteftp,从别的服务器上下载或上传文件,也可以直接通过web形式,建立客户机和服务器端之间的通信,从而从ftp服务器上获取文件,或者对已有文件进行操作。PHP就提供了这样的函数库,可以帮你实现客户机和服务器之间的文件传送。
让我们先回忆一下我们用软件登陆ftp的过程:输入主机名――》输入帐号和密码进行登陆――》获取文件列表――》进行其他操作――》关闭FTP工具,退出。用PHP编程,流程也是一样的.
1,连接服务器
ftp_connect ( string host [, int port [, int timeout]])
host是要连接的服务器,port是服务器的端口号,timeout是连接超时时间限制。通常我们使用默认的port(21)和timeout(90秒)。例如我想连我自己电脑上的FTP,就可以这样
<?php
$conn_id=@ftp_connect(“10.111.149.42”,”21”) or die(“不能连接指定的服务器”);
?>
如果连接失败的话,程序就会告诉我”不能连接指定的服务器”.这里需要注意的是host前不要加”ftp://”,末尾也不要加”/”,下面的写法是错误的:
ftp_connect(“ftp://10.111.149.42”);
ftp_connect(“10.111.149.42/”);
2,登陆服务器
bool ftp_login ( resource ftp_stream, string username, string password)
ftp_stream即为我们上面已经获得的$conn_id,如果这里的用户名和密码是正确的,我们就可以登人给定的FTP连接。我的FTP服务器已经有一个帐号”iwind”,密码是”iwind”:
<?php
$conn_id=@ftp_connect(“10.111.149.42”,”21”) or die(“不能连接指定的服务器”);
@ftp_login($conn_id,”iwind”,”iwind”) or die(“登陆不了,请确认你的用户名和密码”);
?>
通常的FTP都设置有匿名帐号,你不必需要密码,用anonymous即可等入:
ftp_login($conn_id,”anonymous”,””);
3,如果一切都顺利,就可以得到文件列表了
array ftp_rawlist ( resource ftp_stream, string directory)
<?php
//登陆
……
//获取文件列表
$filelist=ftp_rawlist($conn_id,”/”);
?>
我们这样就可以得到主目录的文件和文件夹信息的数组$filelist,你可以把/改成一个子目录,比如”/upload”.以下打印文件列表:
<?
……
//打印文件列表
foreach($filelist as $file){
echo”$file”;
echo”<br>”;
}
?>
这时你会得到这样的结果:
drw-rw-rw- 1 user group 0 Oct 13 12:22 .
drw-rw-rw- 1 user group 0 Oct 13 12:22 ..
drw-rw-rw- 1 user group 0 Jun 18 2003 FILM
drw-rw-rw- 1 user group 0 Oct 13 12:29 MTV
drw-rw-rw- 1 user group 0 Nov 3 19:25 UPLOAD
分别是:
权限 子目录数 用户名称 用户组名称 文件尺寸 最后修改时间 文件(夹)名
在win下得到的子目录数是不正确的。不通的操作系统,得到的信息表达形式略有不同。
4,从服务器上下载或从本地上传文件。
bool ftp_get ( resource ftp_stream, string local_file, string remote_file, int mode [, int resumepos])
这个函数用来下载 FTP 服务器上由 remote_file 参数指定的文件,并保存到由参数 local_file 指定的本地文件。传送模式参数 mode 只能为 (文本模式) FTP_ASCII 或 (二进制模式) FTP_BINARY 中的其中一个。比如我们想把software/pp.rar文件下载到我的本地,并把它命名位mm.rar:
<?php
$ftp=ftp_connect("10.111.149.42","21") or die("fail to connect");
ftp_login($ftp,"anonymous","") or die("fail to login");
$server_file="/UPLOAD/pp.rar";
if (ftp_get($ftp,"mm.rar", $server_file, FTP_BINARY)) {
echo success;
}
else{
echo fail;
}
?>
bool ftp_fput ( resource ftp_stream, string remote_file, resource handle, int mode [, int startpos])
这个函数用来上传一个在已经打开的文件中的数据到 FTP 服务器,参数 handle 为所打开文件的句柄。参数 remote_file 为上传到服务器上的文件名。传输模式参数 mode 只能为 (文本模式) FTP_ASCII 或 (二进制模式) FTP_BINARY 其中的一个。下面是手册里的一个例子
<?php
// 打开一个待读的文件
$file = 'somefile.txt';
$fp = fopen($file, 'r');
// 连接到服务器
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// 试图以ASCII模式上传文件
if(ftp_fput($conn_id, $file, $fp, FTP_ASCII)) {
echo "Successfully uploaded $filen";
} else {
echo "There was a problem while uploading $filen";
}
// 关闭连接和句柄.
ftp_close($conn_id);
fclose($fp);
?>
5,退出连接.
PHP提供了两个含义一样的函数ftp_quit,ftp_close,它们只是名称不一样而已。
void ftp_close ( resource ftp_stream)
这样就把当前活动的ftp连接关闭了。虽然不是必须,但原则上还是需要的。
ftp函数和文件系统函数名称和功能都有很多相近的地方,比如ftp_rmdir和rmdir,ftp_mkdir和mkdir, ftp_rename和rename,大家因此可以触类旁通。