Frage

Ich versuche, ein Skript zu machen, dass die Listen nur innerhalb eines Ordners Ordner. Die Sache ist, dass ich Benutzer, die Ordner in ihren Ordner erstellen kann also im Grunde, was ich versuche zu tun ist, einen Weg zu haben für die Benutzer ihre Ordner und Speichern von Dateien zu verwalten ... Mein Problem ist, dass ich php machen wollen " „denkt, dass der Stammordner ist ihr Home-Verzeichnis, und sie können nicht oberen als ihr Home-Verzeichnis gehen. Derzeit ist meine PHP-Funktion das nicht tun, es zeigt nur den Inhalt des Verzeichnisses ... und wenn der Benutzer geht eine Ebene nach oben und wieder eine Ebene nach oben ... und so weiter .... er konnte das gesamte Fest blättern Laufwerk ein.

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;
}
War es hilfreich?

Lösung

anstelle dem Benutzer einen absoluten Pfad geben, damit ihnen nur Pfade spezifizieren, die zu einem gegebenen Basispfad relativ sind. Als nächstes schreibt eine Funktion, die jeder „/../“ für den relativen Pfad entfernt und Sie sind sicher (solange Benutzer keine Links auf dem Server erstellen können ...).

Wenn Sie nett sein wollen, können Sie vor, dass die „..“ mit dem Element entsprechen (so ‚a /../ b‘ würde ‚b‘ werden, das heißt die „..“ entfernen Sie das ‚a‘ ) oder ignorieren die „..“, wenn es, bevor es kein Pfad Element ist.

Andere Tipps

Hier ist ein wenig etwas zu erweitern auf:

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);

Für $folderPath geben Sie in dem Ordner, von dem Sie die Verzeichnisse aufgelistet werden sollen. Für $homeFolder Pässe im Ordner mögen Sie die obersten Ordner. Durch realpathing beiden Pfade Sie sicherstellen, dass sie absolute Pfade aufgelöst werden. Wenn die $folderPath unter dem $homeFolder ist, dann wird die $folderPath Zeichenfolge mit starten und dem gesamten $homeFolder String enthalten. Ist dies der Fall, wir haben nur glob alle Verzeichnisse in der $folderPath und zurück, um ihre absoluten Pfade in einem Array.


Um den relativen Pfad des $folderPath vom $homeFolder zu bekommen, nur das tun,

ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');

, die ./code/php/ zurückkehren würde.


Wenn Sie dies mit OOP tun möchten, können Sie interessiert sein in der SPL DirectoryIterator .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top