仅使用PHP从FTP服务器列出文件夹

时间:2018-06-19 11:27:26

标签: php ftp

我要在我的Web应用程序中列出我的所有文件夹,不包含其中的文件。目前,我正在使用此代码,但这将为我提供所有文件和文件夹:

//Connect
$conn = ftp_connect($ftp_server);
$login = ftp_login($conn, $ftp_username, $ftp_userpassword);

//
//Enable PASV ( Note: must be done after ftp_login() )
//
$mode = ftp_pasv($conn, TRUE);

$file_list = ftp_nlist($conn, "/webspace/httpdocs/brentstevens.nl/u_media/$uid/");

foreach ($file_list as $file)
{
    // process folder
}

但这将输出所有文件和文件夹。如何调整此代码以仅提供文件夹?

3 个答案:

答案 0 :(得分:1)

如果服务器支持MLSD命令,并且您具有PHP 7.2或更高版本,则可以使用ftp_mlsd function

$files = ftp_mlsd($conn, $path);

foreach ($files as $file)
{ 
    if ($file["type"] == "dir")
    {
        echo $file["name"]."\n";
    }
} 

如果您没有PHP 7.2,则可以尝试自行实现MLSD命令。首先,请参见ftp_rawlist命令的用户注释:
https://www.php.net/manual/en/function.ftp-rawlist.php#101071


没有MLSD来以适用于任何FTP服务器的方式来实现它并不容易。另请参见Check if FTP entry is file or folder with PHP

但是,如果您只需要使用一个特定的FTP服务器,则可以使用ftp_rawlist来检索平台特定格式的文件列表并进行解析。

以下代码假定使用通用的* nix格式。

$lines = ftp_rawlist($conn, $path);

foreach ($lines as $line)
{
    $tokens = explode(" ", $line);
    $name = $tokens[count($tokens) - 1];
    $type = $tokens[0][0];

    if ($type == 'd')
    {
        echo "$name\n";
    }
}

答案 1 :(得分:1)

如果服务器不支持MLSD命令,或者您具有PHP <7.2,并且ftp_rawlist将目录标记为<DIR>

function getList($connection, string $path): array
{
    $rawlist = ftp_rawlist($connection, $path) ?: [];

    $items = [];
    foreach ($rawlist as $data) {
        $item = array_combine(['date', 'time', 'size', 'name'], preg_split('/\s/', $data, -1, PREG_SPLIT_NO_EMPTY));
        $item['type'] = $item['size'] === '<DIR>' ? 'dir' : 'file';
        $item['size'] = (int)$item['size'];

        $items[] = $item;
    }

    return $items;
}

function getFileList($connection, string $path): array
{
    return array_values(array_filter(getList($connection, $path), function ($file) { return $file['type'] === 'file'; }));
}

function getDirList($connection, string $path): array
{
    return array_values(array_filter(getList($connection, $path), function ($file) { return $file['type'] === 'dir'; }));
}

答案 2 :(得分:0)

您必须使用http://php.net/manual/en/function.ftp-rawlist.php函数并使用正则表达式解析类型(在您的情况下为字母d