当前位置: 首页> 最新文章列表> ftp_rawlist 与 array_map 联合处理文件列表

ftp_rawlist 与 array_map 联合处理文件列表

gitbox 2025-05-26

首先,我们通过 ftp_connectftp_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_rawlistarray_map,你可以灵活地处理 FTP 文件列表,实现过滤、结构化、批量链接生成等操作。这种方法不仅高效,还具备良好的可维护性和扩展性。对于需要管理大量 FTP 文件的应用场景,十分推荐采用这一方案。