まず、 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ファイルの管理を必要とするアプリケーションシナリオに強くお勧めします。