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文件列表的管理後台或文件瀏覽功能,使數據處理更加直觀和高效。