Mostrar archivos de una carpeta con PHP

Aunque normalmente cuando se quiere acceder a algún archivo lo que se suele hacer es almacenar su ruta en base de datos puede haber ocasiones en las que por el caso que sea no se quiera usar una base de datos. Aquí vamos a ver como se puede recorrer la estructura de directorios mediante PHP y como podemos mostrar las imágenes de una carpeta sin saber cuantas hay ni que nombres tienen.

En este primer ejemplo vamos a recorrer recursivamente todos las carpetas a partir de la ruta indicada y que se muestre una lista con las carpetas tabuladas al estilo del explorador de Windows.

Para poder mostrar el contenido de un directorio en PHP hay que usar la función opendir(ruta_directorio) que devuelve un manejador/gestor y luego tenemos que pasarle este resultado a la función readdir(gestor/manejador_directorios) que devuelve el siguiente elemento del directorio por lo que se puede usar como iterador para recorrer el directorio y finalmente con la función closedir(gestor/manejador_directorios) se cierra el gestor de directorios previamente abierto.


/**
 * Funcion que muestra la estructura de carpetas a partir de la ruta dada.
 */

function obtener_estructura_directorios($ruta){
    // Se comprueba que realmente sea la ruta de un directorio
    if (is_dir($ruta)){
        // Abre un gestor de directorios para la ruta indicada
        $gestor = opendir($ruta);
        echo "<ul>";

        // Recorre todos los elementos del directorio
        while (($archivo = readdir($gestor)) !== false)  {
                
            $ruta_completa = $ruta . "/" . $archivo;

            // Se muestran todos los archivos y carpetas excepto "." y ".."
            if ($archivo != "." && $archivo != "..") {
                // Si es un directorio se recorre recursivamente
                if (is_dir($ruta_completa)) {
                    echo "<li>" . $archivo . "</li>";
                    obtener_estructura_directorios($ruta_completa);
                } else {
                    echo "<li>" . $archivo . "</li>";
                }
            }
        }
        
        // Cierra el gestor de directorios
        closedir($gestor);
        echo "</ul>";
    } else {
        echo "No es una ruta de directorio valida<br/>";
    }
}

La comparación de readdir en el while no se hace directamente porque si en lugar de comprobar que no sea false se hiciese directamente en el caso de que hubiese una carpeta o archivo con el nombre 0 saldría del bucle porque interpretaría que se han acabado los elementos del directorio. Aunque supongo que no es muy habitual poner ese nombre a nada, siempre es mejor hacer las cosas bien.

También se comprueba que el «archivo» no sea ni «.» ni «..» porque siempre están en todos los directorios (como es logico) pero no aportan absolutamente nada.

Con el ejemplo anterior se puede ver como mostrar los archivos de un directorio con PHP pero ciertamente es un ejemplo de poca utilidad más allá de ver como funciona por eso voy a poner otro ejemplo de como mostrar las imágenes de una carpeta usando la misma técnica aunque en este caso sin hacer la función recursiva porque normalmente querremos mostrar las imágenes de un directorio concreto, sin recorrer nada más.


/**
 * Funcion que muestra las imagenes que hay en la ruta pasada como parametro
 */

function mostrar_imagenes($ruta){
    // Se comprueba que realmente sea la ruta de un directorio
    if (is_dir($ruta)){
        // Abre un gestor de directorios para la ruta indicada
        $gestor = opendir($ruta);

        // Recorre todos los archivos del directorio
        while (($archivo = readdir($gestor)) !== false)  {
            // Solo buscamos archivos sin entrar en subdirectorios
            if (is_file($ruta."/".$archivo)) {
                echo "<img src='".$ruta."/".$archivo."' width='200px' alt='".$archivo."' title='".$archivo."'>";
            }            
        }

        // Cierra el gestor de directorios
        closedir($gestor);
    } else {
        echo "No es una ruta de directorio valida<br/>";
    }
}

Así de simple es mostrar las imágenes de un directorio con PHP y simplemente hay que tener en cuenta que para que la imagen se pueda visualizar hay que concatenar en nombre de la imagen con la ruta.

Y el formato de la ruta para llamar a la función es el siguiente:


// Ruta de la carpeta en la que se encuentra el archivo desde el que 
// se hace esta llamada
obtener_estructura_directorios("./");
// Ruta de una carpeta que se encuentra dentro de la carpeta en la que
// esta el archivo desde el que se hace esta llamada
obtener_estructura_directorios("nombre_carpeta");
// Ruta de una carpeta que se encuentra en la carpeta padre de la
// carpeta en la que esta el archivo desde el que se hace esta llamada
obtener_estructura_directorios("../nombre_carpeta");

Y si quieres te puedes descargar ambos ejemplos para comprobar su funcionamiento aquí.