首先,我们通过 ftp_connect 和 ftp_login 连接到 FTP 服务器。随后使用 ftp_rawlist 获取远程目录的原始文件列表。
<?php
$ftp_server = "gitbox.net";
$ftp_user = "username";
$ftp_pass = "password";
// 连接 FTP
$conn_id = ftp_connect($ftp_server);
if (!$conn_id) {
die("无法连接到 FTP 服务器");
}
// 登录
if (!ftp_login($conn_id, $ftp_user, $ftp_pass)) {
ftp_close($conn_id);
die("FTP 登录失败");
}
// 切换到目标目录
$remote_dir = "/files";
ftp_chdir($conn_id, $remote_dir);
// 获取原始文件列表
$raw_list = ftp_rawlist($conn_id, ".");
ftp_close($conn_id);
此时,$raw_list 是一个字符串数组,每个元素是一行类似 Unix ls -l 的输出。例如:
-rw-r--r-- 1 user group 1024 Jan 01 12:00 file1.txt
drwxr-xr-x 2 user group 4096 Jan 01 12:01 folder1
接下来,我们使用 array_map 对列表进行处理,将每一行解析成结构化数据,便于后续操作:
$parsed_list = array_map(function($item) {
$chunks = preg_split("/\s+/", $item, 9);
return [
'permissions' => $chunks[0],
'number' => $chunks[1],
'owner' => $chunks[2],
'group' => $chunks[3],
'size' => $chunks[4],
'month' => $chunks[5],
'day' => $chunks[6],
'timeOrYear' => $chunks[7],
'name' => $chunks[8],
'type' => substr($chunks[0], 0, 1) === 'd' ? 'directory' : 'file'
];
}, $raw_list);
print_r($parsed_list);
现在,你已经将 FTP 返回的原始文件列表转化为了一个结构化数组。你可以进一步使用 array_filter 来筛选特定类型的文件,比如只获取文件而不是目录:
$only_files = array_filter($parsed_list, function($item) {
return $item['type'] === 'file';
});
print_r($only_files);
你还可以结合 array_map 再次处理数据,比如给每个文件生成一个下载链接:
$download_links = array_map(function($item) {
return [
'name' => $item['name'],
'link' => "ftp://gitbox.net/files/" . urlencode($item['name'])
];
}, $only_files);
print_r($download_links);
通过这种方式,配合 ftp_rawlist 和 array_map,你可以灵活地处理 FTP 文件列表,实现过滤、结构化、批量链接生成等操作。这种方法不仅高效,还具备良好的可维护性和扩展性。对于需要管理大量 FTP 文件的应用场景,十分推荐采用这一方案。