Pregunta

Estoy tratando de hacer un script que las listas sólo las carpetas dentro de una carpeta. La cosa es que tengo usuarios que pueden crear carpetas dentro de sus carpetas así que básicamente lo que estoy tratando de hacer es tener una forma para que los usuarios administrar sus carpetas y archivos que almacenan ... Mi problema es que quiero hacer php " pensar" que la carpeta raíz es su directorio personal y no puede ir superior de su directorio personal. Actualmente mi función de php no hace eso, sólo muestra el contenido del directorio ... y si el usuario pasa a un nivel superior y otra vez a un nivel superior ... y así sucesivamente .... podía ver todo el disco unidad.

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;
}
¿Fue útil?

Solución

En lugar de dar al usuario una ruta absoluta, solamente les permiten especificar las rutas que son relativas a una ruta de base dada. A continuación, escribir una función que permite eliminar el "/../" para la ruta relativa y que está a salvo (siempre que los usuarios no pueden crear enlaces en el servidor ...).

Si quieres ser agradable, que puede coincidir con el ".." con el elemento antes de que (por lo que 'un /../ b' se convertiría en 'b', es decir, el ".." eliminar 'a' ) o ignorar el ".." si no hay un elemento de la ruta antes de ella.

Otros consejos

Aquí hay un poco de algo para expandir en:

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

Para $folderPath se pasa en la carpeta que desea listar los directorios de. Para pase $homeFolder en la carpeta que desea ser el más carpeta superior. Por realpathing ambos caminos se asegure de que se resuelven a rutas absolutas. Si el $folderPath está por debajo del $homeFolder, entonces la cadena $folderPath va a comenzar y contiene toda la cadena $homeFolder. Si este es el caso, sólo glob todos los directorios en la $folderPath y devolver sus pathes absolutos en una matriz.


Para obtener la ruta relativa de la $folderPath del $homeFolder, acaba de hacer

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

que volver ./code/php/.


Si usted quiere hacer esto con programación orientada a objetos, que podría estar interesado en el SPL DirectoryIterator .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top