首先,使用 ftp_connect 建立与 FTP 服务器的连接,然后用 ftp_login 函数登录。
<?php
// 连接 FTP 服务器
$ftp_server = "gitbox.net";
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) {
die("无法连接到 FTP 服务器 $ftp_server");
}
// 登录
$ftp_user = "your_username";
$ftp_pass = "your_password";
if (!ftp_login($conn_id, $ftp_user, $ftp_pass)) {
die("FTP 登录失败");
}
echo "成功连接并登录到 $ftp_server\n";
?>
登录成功后,我们使用 ftp_rawlist 获取目录中的文件和文件夹信息。
<?php
// 获取当前目录列表
$directory = "/";
$file_list = ftp_rawlist($conn_id, $directory);
if ($file_list === false) {
die("无法获取目录列表");
}
// 输出目录信息
foreach ($file_list as $file) {
echo $file . "<br>";
}
?>
这里返回的是一个包含文件详细信息的数组,类似 Linux ls -l 命令的输出。
为了更方便显示,我们需要对 ftp_rawlist 返回的字符串进行解析,分辨文件和目录。
<?php
function parseFtpRawList($raw_list) {
$items = [];
foreach ($raw_list as $line) {
$chunks = preg_split("/\s+/", $line, 9);
if (count($chunks) === 9) {
list($permissions, $number, $owner, $group, $size, $month, $day, $timeOrYear, $name) = $chunks;
$items[] = [
'permissions' => $permissions,
'size' => $size,
'name' => $name,
'is_dir' => $permissions[0] === 'd',
'raw' => $line,
];
}
}
return $items;
}
$parsed_list = parseFtpRawList($file_list);
foreach ($parsed_list as $item) {
echo ($item['is_dir'] ? "[DIR] " : "[FILE] ") . htmlspecialchars($item['name']) . "<br>";
}
?>
我们可以根据用户点击的目录名来切换路径,支持递归浏览。
<?php
// 通过 GET 参数获得当前目录
$current_dir = isset($_GET['dir']) ? $_GET['dir'] : "/";
// 避免路径穿越攻击
$current_dir = str_replace(["..", "//"], "", $current_dir);
$file_list = ftp_rawlist($conn_id, $current_dir);
$parsed_list = parseFtpRawList($file_list);
echo "<h2>目录: " . htmlspecialchars($current_dir) . "</h2>";
echo "<ul>";
// 上级目录链接
if ($current_dir !== "/") {
$parent_dir = dirname($current_dir);
if ($parent_dir == "\\") $parent_dir = "/";
echo '<li><a href="?dir=' . urlencode($parent_dir) . '">[..]</a></li>';
}
foreach ($parsed_list as $item) {
if ($item['is_dir']) {
echo '<li>[DIR] <a href="?dir=' . urlencode(rtrim($current_dir, "/") . "/" . $item['name']) . '">' . htmlspecialchars($item['name']) . '</a></li>';
} else {
echo '<li>[FILE] ' . htmlspecialchars($item['name']) . '</li>';
}
}
echo "</ul>";
?>
浏览完毕,别忘了关闭连接。
<?php
ftp_close($conn_id);
?>
通过上述步骤,我们完成了一个基于 PHP 的简单 FTP 文件浏览器:
连接并登录 FTP 服务器
使用 ftp_rawlist 获取目录内容
解析并区分文件与目录
实现目录切换浏览
你可以根据这个基础,进一步扩展功能,比如文件下载、删除、上传等。希望本文能帮助你快速上手 PHP FTP 编程!