ftp_rawlist返回的是一个字符串数组,每个字符串类似于Linux系统中ls -l命令的输出,例如:
-rw-r--r-- 1 user group 1234 May 10 10:00 file1.txt
drwxr-xr-x 2 user group 4096 May 09 09:00 folder1
每行包含的信息依次为:
文件权限(如 -rw-r--r--)
硬链接数
文件所属用户
文件所属组
文件大小(字节数)
修改日期(通常包含月、日、时间或年份)
文件名
解析过程的重点是将每行字符串拆解成各个字段,并整理成键值对。示例代码如下:
<?php
function parseRawList(array $rawList): array {
$files = [];
foreach ($rawList as $line) {
$chunks = preg_split('/\s+/', $line, 9);
if (count($chunks) < 9) {
continue; // 格式异常,跳过
}
list($permissions, $links, $owner, $group, $size, $month, $day, $timeOrYear, $name) = $chunks;
// 根据timeOrYear判断年份或时间
if (strpos($timeOrYear, ':') !== false) {
// 含时间,年份取当前年份
$year = date('Y');
$time = $timeOrYear;
} else {
$year = $timeOrYear;
$time = '00:00';
}
// 拼接完整修改时间,转换为时间戳
$dateStr = "$month $day $year $time";
$timestamp = strtotime($dateStr);
$files[] = [
'name' => $name,
'permissions' => $permissions,
'links' => (int)$links,
'owner' => $owner,
'group' => $group,
'size' => (int)$size,
'modified' => date('Y-m-d H:i:s', $timestamp),
'is_dir' => $permissions[0] === 'd',
];
}
return $files;
}
?>
完整示例展示如何连接FTP服务器,调用ftp_rawlist,然后使用上面的解析函数转换并输出JSON:
<?php
$ftpServer = 'gitbox.net';
$ftpUser = 'username';
$ftpPass = 'password';
// 建立FTP连接
$connId = ftp_connect($ftpServer);
if (!$connId) {
die("无法连接到FTP服务器 $ftpServer");
}
// 登录
if (!ftp_login($connId, $ftpUser, $ftpPass)) {
ftp_close($connId);
die("FTP登录失败");
}
// 获取原始文件列表
$rawList = ftp_rawlist($connId, '.');
if ($rawList === false) {
ftp_close($connId);
die("获取FTP列表失败");
}
// 解析列表
$filesArray = parseRawList($rawList);
// 输出JSON格式
header('Content-Type: application/json');
echo json_encode($filesArray, JSON_PRETTY_PRINT);
// 关闭连接
ftp_close($connId);
// 解析函数同上,略
?>
通过以上方法,我们将ftp_rawlist函数的字符串列表结果转换成了结构化数组,并最终生成了JSON格式数据。这样,不仅方便PHP程序内部对FTP文件列表的操作,也方便将数据通过API传输给前端或其他系统。
这种方式特别适合构建基于FTP文件列表的管理后台或文件浏览功能,使数据处理更加直观和高效。