我要在我的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
}
但这将输出所有文件和文件夹。如何调整此代码以仅提供文件夹?
答案 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