制限付きのディレクトリリスト
-
01-10-2019 - |
質問
フォルダー内のフォルダーのみをリストするスクリプトを作成しようとしています。問題は、フォルダー内にフォルダーを作成できるユーザーがいるので、基本的に私がやろうとしていることは、ユーザーがフォルダーを管理してファイルを保存する方法を持つことです...私の問題は、PHPを作成したいということです。 「ルートフォルダーはホームディレクトリであり、ホームディレクトリよりも上に行くことができないと考えてください。現在、私のPHP関数はそれを行いません、それはディレクトリのコンテンツのみを表示します...そして、ユーザーが1つのレベルを上げて、再び1つのレベルアップ...など....彼はハード全体を閲覧することができましたドライブ。
function directoryList($path) {
$dirStruct = array();
if(is_dir($path)) {
$handle = opendir($path);
while(($file = readdir($handle)) !== false) {
if(@opendir($path.$file)) {
chdir($path.$file);
$absolutepath = getcwd();
$dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file);
}
}
}
return $dirStruct;
}
解決
ユーザーに絶対パスを与える代わりに、特定のベースパスに関連するパスを指定できるようにします。次に、相対パスの「/../」を削除する関数を書きます。ユーザーがサーバーにリンクを作成できない限り...)。
あなたが良くなりたい場合は、その前の要素と「..」を一致させることができます(したがって、「a /../ b」は「b」になります。 「..」の前にパス要素がない場合。
他のヒント
これが拡張するための少しのものです:
function listFolders($folderPath, $homeFolder)
{
$folderPath = realpath($folderPath);
$homeFolder = realpath($homeFolder);
if(strpos($folderPath, $homeFolder) === 0) {
return glob("$folderPath/*", GLOB_ONLYDIR);
}
}
$dirs = listFolders('/home/gordon/code/php', '/home/gordon');
print_r($dirs);
にとって $folderPath
ディレクトリをリストするフォルダーを渡します。にとって $homeFolder
最も多くのフォルダーになりたいフォルダーを渡します。に realpath
両方のパスを使用すると、それらが絶対的なパスに解決されることを確認します。場合 $folderPath
下にあります $homeFolder
, 、 そうして $folderPath
文字列は始まり、全体が含まれます $homeFolder
ストリング。この場合、私たちだけです glob
のすべてのディレクトリ $folderPath
アレイに絶対的なパスを返します。
の相対パスを取得するため $folderPath
から $homeFolder
, 、ただしてください
ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');
それが戻ってきます ./code/php/
.
OOPでこれをやりたい場合は、に興味があるかもしれません SPL Directoryiterator.