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

问题描述 投票:1回答:2

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

//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
}

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

php ftp
2个回答
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";
    }
}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.