Mostrar archivos de un directorio con PHP

Lechugas de mi corazón! Como va todo?
Disfrutando de las fiestas? Bueno, supongo que algunos si. Para otros ya se les habrá acabado.

Pero bueno, después de este pequeño descanso nos ponemos las pilas de nuevo ^_^.

Para el tema de hoy tenemos algo muy sencillo pero que se puede usar de modos muy útiles.

Vamos a mostrar el contenido de un directorio mediante PHP.

<?php
 
function leer_archivos_y_directorios($ruta)
{
    // comprobamos si lo que nos pasan es un direcotrio
    if (is_dir($ruta))
    {
        // Abrimos el directorio y comprobamos que
        if ($aux = opendir($ruta))
        {
            while (($archivo = readdir($aux)) !== false)
            {
                // Si quisieramos mostrar todo el contenido del directorio pondríamos lo siguiente:
                // echo '<br />' . $file . '<br />';
                // Pero como lo que queremos es mostrar todos los archivos excepto "." y ".."
                if ($archivo!="." && $archivo!="..")
                {
                    $ruta_completa = $ruta . '/' . $archivo;
 
                    // Comprobamos si la ruta más file es un directorio (es decir, que file es
                    // un directorio), y si lo es, decimos que es un directorio y volvemos a
                    // llamar a la función de manera recursiva.
                    if (is_dir($ruta_completa))
                    {
                        echo "<br /><strong>Directorio:</strong> " . $ruta_completa;
                        leer_archivos_y_directorios($ruta_completa . "/");
                    }
                    else
                    {
                        echo '<br />' . $archivo . '<br />';
                    }
                }
            }
 
            closedir($aux);
 
            // Tiene que ser ruta y no ruta_completa por la recursividad
            echo "<strong>Fin Directorio:</strong>" . $ruta . "<br /><br />";
        }
    }
    else
    {
        echo $ruta;
        echo "<br />No es ruta valida";
    }
}

 

 

En nuestro caso hemos puesto un ejemplo para leer los archivos de imagen de un directorio de prueba.

Como se puede comprobar en el código y en el ejemplo, el algoritmo es recursivo. Lo hemos hecho de este modo para poder acceder a los posibles subdirectorios que existan.

Esperamos que os sea útil el código, tanto para usarlo como para haceros una idea de como funciona 😉

Actualización 12/10/2013:
Hemos visto que el enlace al ejemplo no funcionaba.
Fue por un cambio de carpetas en el servidor. Aquí tenéis el ejemplo.
Las carpetas que contienen los archivos que se muestran, están dentro de otra que se encuentra al mismo nivel que el archivo que las muestra (éste se llama ‘mostrar_archivos.php’), por lo tanto la variable $ruta debe de ser ‘.’.
Espero que estas aclaraciones ayuden a los que tengan cualquier problema ^_^

Y recordad que si quereis contar con nosotros para realizar vuestra página web podeis poneros en contacto con nosotros en:

www.freshware.es

30 comentarios en “Mostrar archivos de un directorio con PHP

  • Antetodo enhorabuena por tu trabajo y muchas gracias por compartir tus codigos.

    Comentarte que en ejemplo dices que lee los archivos de imagen de un directorio y sus subdirectorios, pero aclarar que no solo lee los archivos de imagen, sino que lee cualquier archivo.

    Por otro lado me gustareia pedirte ayuda con un codigo (que es parecido a este) y necesitaria que fuera recursivo en los subdirectorios, pero como soy novato no me aclaro y me gustaria pedirte ayuda.

    Cmo podria hacer para que este codigo leyera tambien subdirectorios por favor?
    Te estaria muy agracecido

    function returnimages($dirname = “./img/”) {
    $pattern=”\.(jpg|jpeg|png|gif|bmp)$”;
    $files = array();
    $curimage=0;
    if($handle = opendir($dirname)) {
    while(false !== ($file = readdir($handle))){
    if(eregi($pattern, $file)){
    echo ‘myimages[‘ . $curimage .’]=”‘ . $dirname . $file . ‘”;’ . “\n”;
    $curimage++;
    }
    }

    closedir($handle);
    }
    return($files);
    }

    gracias de antemano

    Un saludo y enhorabuena de nuevo

    • Primero de todo GRACIAS por tus palabras.
      Las agradecemos un montón ^_^.

      Por otro lado comentarte que tienes razón, la función lee cualquier archivo. Pero es que esta pensada para que lea carpetas donde sólo se alojen imágenes.

      Para la duda que tienes te contestaré por mail, porque hay diferentes opciones.
      Pero si alguien quiere que lo pongamos por aquí, que de un silbidito.

      Saludos!

        • Muy buenas,
          Esta es la respuesta que le envié a Levi:

          Voy a ver si te puedo echar una mano.

          A ver… para empezar, como dices que eres novato, te voy a explicar un poquito sobre la recursividad (muy rápido).

          Existen dos tipos de recursividades: la recursividad final y la recursividad no-final.

          ¿En que se diferencian?
          Bueno, la primera es que acaba cuando llega al final del bloque recursivo. En la otra, cuando llega al final, tiene que volver.

          Por ejemplo, si se busca un nodo en un arbol. La recusividad final sería al llegar a un nodo sin hijos (una hoja):

          1
          |
          2 ———- 3
          | |
          |—–| |—–|
          4 5 6 7

          En nuestro ejemplo, las hojas son 4, 5, 6 y 7.

          La recursividad final serviría para decirnos, por ejemplo, cuanto suman una rama determinada (La rama 1-2-4 sumaria 7, por ejemplo).

          Con la recursividad no-final sabriamos cuanto suma todo el arbol, porque al acabar en una hoja, podría subir al nodo anterior y bajar por el siguiente hijo (si lo tiene, sino, sube al nodo anterior).

          Aplicado al código que tu me comentas yo lo que yo haría sería ponerlo en el momento en el que comprueba los archivos.
          Es decir, en tu caso quieres que cuando vaya leyendo los archivos entre en los subdirectorios y que lea también las imágenes dentro de éstos.
          Para hacerlo, dentro del while deberíamos de poner un condicional.

          Pero aquí entran algunas cosas que no acaban de estar bien en tu código.
          La primera (y menos importante) es que la función eregi() esta obsoleta. Ahora se usa preg_match()… pero, a pesar de que (por lo visto) el funcionamiento de la función, valga la redundancia, es distinto, para el común de los mortales, como tu y yo, es solo un cambio de nombre.

          Por otro lado no compruebas que el archivo ($file) sea un directorio.
          Estoy hablando de justo después del while.
          Dentro de éste, antes del if donde compruebas si los caracteres de $file deberías de preguntarte si lo que está leyendo es un archivo o un directorio.
          En el caso de que sea un directorio haces la llamada a la misma función en la que estas, pero con la ruta de ese directorio.

          Quedaría así:

          function returnimages($dirname = "./img/")
          {
          $pattern="\.(jpg|jpeg|png|gif|bmp)$";
          $files = array();
          $curimage = 0;

          if ($handle = opendir($dirname))
          {
          while (false !== ($file = readdir($handle)))
          {
          if (is_dir($file))
          {
          returnimages($file)
          }
          else (preg_match($pattern, $file))
          {
          echo 'myimages[' . $curimage .']="' . $dirname .$file . '";' . "\n";
          $curimage++;
          }
          }
          }
          }

          Pero esto te va a dar un fallo.
          A la función preg_match() le estas pasando $pattern. Y esta variable empieza con contrabarra ( \ ), cuando lo que necesita es un carácter alphanumerico.
          Por lo tanto se tendría que cambiar la forma de llamar al directorio y la forma de conocer la extensión.

          No se si habrían más fallos. Ni si funcionaria al final.
          Yo lo veo un poco raro el código.
          Pero la programación puede funcionar de maneras distintas.

          Lo que yo he hecho para conseguir lo que creo que tu quieres (mostrar SÓLO las imágenes ¿no?) ha sido modificar mi código y hacer que sólo muestre los archivos con las extensiones que me interesan.

          Para ello he seguido una regla básica para la programación: Divide y vencerás!

          Tenemos dos problemas:

          Recorrer los directorios y subdirecotorios para mostrar archivos
          y mostrar los archivos que solo sean imágenes

          El primer punto lo tengo resulto con mi código.
          El segundo lo puedo resolver.

          Lo que queremos es que se muestren los archivos con las extensiones que nos interesan.
          Así que vamos a hacer una función que nos resuelva ese problema:

          function extension($nombre_archivo)
          {
          return substr(strrchr($nombre_archivo, '.'), 1);
          }

          Con esta función obtenemos la extensión de todos los archivos.

          Ahora, la compararemos con las de los archivos que nos interesa mostrar (jpg, jpeg, png, gif, bmp).
          Esa comparación la tendremos que hacer en el momento de mostrar el archivo.
          Lo haremos con un condicional: Si la extensión del archivo es igual a jpg o a jpeg o a bmp… muestra el archivo.
          El código:

          function leer_imagenes_de_directorios($ruta)
          {
          // comprobamos si lo que nos pasan es un direcotrio
          if (is_dir($ruta))
          {
          // Abrimos el directorio y comprobamos que
          if ($aux = opendir($ruta))
          {
          while (($archivo = readdir($aux)) !== false)
          {
          // Si quisieramos mostrar todo el contenido del directorio pondríamos lo siguient:
          // echo '
          ' . $file . '
          ';
          // Pero como lo que queremos es mostrar todos los archivos excepto "." y ".."
          if ($archivo!="." && $archivo!="..")
          {
          $ruta_completa = $ruta . '/' . $archivo;

          // Comprobamos si la ruta más file es un directorio (es decir, que file es
          // un directorio), y si lo es, decimos que es un directorio y volvemos a
          // llamar a la función de manera recursiva.
          if (is_dir($ruta_completa))
          {
          echo "
          Directorio: " . $ruta_completa;
          leer_imagenes_de_directorios($ruta_completa . "/");
          }
          else
          {
          // Comprobamos la extensión del archivo antes de mostrarlo.
          // En caso de no ser una de las que queremos no se mostrará.
          if ((extension($archivo) == "gif") || (extension($archivo) == "jpeg") || (extension($archivo) == "jpg") || (extension($archivo) == "png") ||
          (extension($archivo) == "gif") || (extension($archivo) == "bmp"))
          {
          echo '
          ' . $archivo . '
          ';
          }
          }
          }
          }

          closedir($aux);

          // Tiene que ser ruta y no ruta_completa por la recursividad
          echo "Fin Directorio:" . $ruta . "

          ";
          }
          }
          else
          {
          echo "
          No es ruta valida";
          }
          }

          function extension($nombre_archivo)
          {
          return substr(strrchr($nombre_archivo, '.'), 1);
          }

          Funciona. Comprobado.
          Lo nuevo te lo he puesto en azul.

          Aunque a lo mejor lo que tu esperabas es que hiciéramos funcionar tu código. Si es así, lo siento… pero programar es como cocinar. Cada uno lo hace a su manera y yo no acababa de ver la manera de usar tu código.

          Bueno, espero haberte ayudado.

          Un saludete!

          Fran.

  • Hola! Yo también soy novata y llevo un buen tiempo intentando listar un directorio sin mostrar archivos php ni carpetas cgi-bin que están en el directorio.

    Muchas gracias por el aporte, pero cómo podría hacer para que no muestre determinados tipos de archivos o carpetas con determinado nombre? Como los casos que nombre

    Muchas gracias! Saludos

    • Muy buenas!
      Y muchas gracias por tu comentario.

      Si lo que quieres es que no entre en una carpeta cgi-bin, lo que tienes que hacer es modificar la linea 9, cambiandola por

      [sourcecode language=”php”]

      < ?php ... if (($aux = opendir($ruta)) && ($ruta != 'cgi-bin')) { ... [/sourcecode] Y para que saber si un archivo es .php lo que necesitamos es usar la función substr().
      Por lo que tendremos que modificar la linea 16.

      [sourcecode language=”php”]

  • Hola, implemente el código y todo sale perfecto, crea la nueva imagen con la resolucion que quiero, pero al momento de abrirla me muestra solo una pantalla negra, no se que estoy haciendola mal,y muy buen aporte por cierto ya llevaba rato intentado hacer esto 😀

    • Muy buenas,
      El código muestra los archivos de manera en que se organizan en el servidor, y por defecto esta forma es alfabéticamente.

      Esto no es un problema para mostrar solo los 10 últimos… aunque hay que distinguir si los 10 últimos quiere decir ‘los 10 últimos alfabeticamente’ (como se muestran ahora) o ‘los 10 últimos por fecha’.

      En el caso que nos ocupa, tendríamos que ir añadiendo los archivos en un array (en la linea 30 en lugar de añadir un ‘echo …’ pondríamos algo como ‘$miarray = $archivo;’, donde $miarray sería un array que habríamos definido desde el principio).

      Luego solo tendría que mostrar el contenido de ese array de forma inversa.


      < ?php function leer_archivos_y_directorios($ruta) { // creamos el array $miarray = array(); // comprobamos si lo que nos pasan es un direcotrio if (is_dir($ruta)) { // Abrimos el directorio y comprobamos que if ($aux = opendir($ruta)) { while (($archivo = readdir($aux)) !== false) { // Si quisieramos mostrar todo el contenido del directorio pondríamos lo siguiente: // echo '
      ' . $file . '
      ';
      // Pero como lo que queremos es mostrar todos los archivos excepto "." y ".."
      if ($archivo!="." && $archivo!="..")
      {
      $ruta_completa = $ruta . '/' . $archivo;

      // Comprobamos si la ruta más file es un directorio (es decir, que file es
      // un directorio), y si lo es, decimos que es un directorio y volvemos a
      // llamar a la función de manera recursiva.
      if (is_dir($ruta_completa))
      {
      // echo "
      Directorio: " . $ruta_completa;
      leer_archivos_y_directorios($ruta_completa . "/");
      }
      else
      {
      // echo '
      ' . $archivo . '
      ';
      $miarray = $archivo;
      }
      }
      }

      closedir($aux);

      // Tiene que ser ruta y no ruta_completa por la recursividad
      // echo "Fin Directorio:" . $ruta . "

      ";
      }
      }
      else
      {
      echo $ruta;
      echo "
      No es ruta valida";
      }

      for ($i = count($miarray), $i < = (count($miarray) - 10), $i--) { // Así mostraríamos los 10 últimos alfabéticamente. echo '
      ' . $miarray[$i] . '
      ';
      }
      }

      Para mostrarlos por fecha, tendríamos que usar la función ‘filectime($nombre_archivo)’ e incluir ese dato en el array o en otro auxiliar.

      Ese código se complica un poco y no tengo demasiado tiempo, así que en caso de necesitarlo, decídmelo y lo pondré otro día.

      Un saludo,

      Fran.

      P.D: El código que acabo de poner no lo he probado, por lo que puede tener fallos ;D

  • Hola, una pregunta: Necesito vincular un textbox de Dw y que al momento de poner un dato por ejemplo Empresa Patito me mande en pantalla los archivos contenidos en una carpeta y son .pdf y .xml

    ¿Crees que me podrías ayudar con un ejemplo o alguna página?

    Gracias!

    • Entiendo lo que quieres, pero no es este tipo de código.

      Un componente muy sencillo que puedes usar es este: https://jqueryui.com/autocomplete/
      Es el ‘autocomplete’ realizado por jquery.

      En esa misma página te dan un código de ejemplo.
      Es este:

      < !doctype html>



      jQuery UI Autocomplete - Default functionality





      Lo que tienes que hacer es que en la parte donde se dan los datos para el contenido (la variable ‘availableTags’), es pasarle el nombre de los archivos con la función que yo he aportado en el post.

      Espero haberte ayudado.

      Un saludo,

      Fran.

  • una duda haber si me puedes ayudar de ante mano gracias, necesito mostrar archivos con ciertas caracteristicas ahorita los he podido mostrar con globe() pero necesito mostrar solo el nombre del archivo y su extension, el problema que tengo con globe es que me dibuja el array y ademas me pone la ruta del archivo, estoy creando un sitio de descarga de archivos pdf y xml, para que el cliente inicie sesion y descargue sus facturas, notas de credito y devoluciones, entonces lo que hago es mostrarle el contenido de la carpeta del cliente cuando inicia sesion. Esto es lo que tengo ahorita:
    if(isset($_POST[‘aabuscar’])){
    foreach ($_POST[‘aabuscar’] as $key => $value) {
    $barchivo = $carpeta . $value . ‘*’;
    foreach(glob($barchivo) as $archivo) {
    echo $archivo . ”;
    }
    }
    }else{
    echo ‘Selecciona al menos uno para buscar los archivos.‘;
    }
    ?>
    Lo que hago primero es ver que si haya seleccionado al menos un checkbox, luego busco los archivos con la letra de lo que selecciono, ya que los nombres de archivo son su serie y su folio (ej, LP-1234), necesito mostrarle solo el nombre de archivo. gracias de nuevo por cualquier ayuda aportada.

    • Muy buenas,
      Para no deshacer nada de tu código y que te sirva lo que ya has hecho, veo dos opciones para trabajar. Estas opciones son dos funciones de php (incluso una combinación de ambas no estaría mal).
      substr y explode.

      Substr sirve para devolver una cadena:

      $rest = substr("abcdef", -1); // devuelve "f"

      Así pues, si la url es de este tipo:

      http://www.mi.web/directorio/contenedor/de/ficheros/mifichero.pdf

      Puedes empezar a buscar desde el final hacia el principio, hasta encontrar un caracter ‘/’ te debería devolver el nombre del archivo (en el ejemplo sería ‘mifichero.pdf’).

      La segunda opción divide un string en varios otros y los puedes obtener mediante un array:

      < ?php $str = 'uno|dos|tres|cuatro'; // límite positivo print_r(explode('|', $str, 2)); // líimte negativo (desde PHP 5.1) print_r(explode('|', $str, -1)); ?>

      El ejemplo devolvería

      Array
      (
      [0] => uno
      [1] => dos|tres|cuatro
      )
      Array
      (
      [0] => uno
      [1] => dos
      [2] => tres
      )

      Usando esta función y sustituyendo el separador ‘|’ por ‘/’, podrías obtener todos los parametros de la url, con lo que solo deberías mostrar el último.

      Espero haberte ayudado con esto.

      Un saludo,

      Fran.

    • Pues la ruta completa sería la ruta de la url, no la del sistema, es decir:

      http://www.mipaginaweb.com/carpeta/archivo.bla

      Espero que te sirva de algo (sobre todo después de darme cuenta que esto lo preguntaste en octubre y es diciembre :P)

    • El código lee la carpeta que pongas en la ruta, si lees a partir de donde estás (si estás haciendolo con Xamp/htdocs evidentemente lerá a partir de ahí, pero siempre puedes navegar a partir de la ruta navegando por el arbol de archivos ( con .. para ir una carpeta atras y con /diectorio para subir una carpeta alante). Por otro lado si quieres leer dentro del servidor, lo mismo, si ejecutas el código en el servidor, navegará a partir de la carpeta en la que tienes el código, tomandola como raíz.
      Espero serte de ayuda.

  • saludos disculpa mi novatara este archivo lo que me permite es como listar el nombre de todos los archivos que tenga en una ruta??? si es asi me puedes explicar un poco el código que debo cambiar de acá

    <?php

    function leer_archivos_y_directorios($ruta)
    {
    // comprobamos si lo que nos pasan es un direcotrio
    if (is_dir($ruta))
    {
    // Abrimos el directorio y comprobamos que
    if ($aux = opendir($ruta))
    {
    while (($archivo = readdir($aux)) !== false)
    {
    // Si quisieramos mostrar todo el contenido del directorio pondríamos lo siguiente:
    // echo '’ . $file . ”;
    // Pero como lo que queremos es mostrar todos los archivos excepto “.” y “..”
    if ($archivo!=”.” && $archivo!=”..”)
    {
    $ruta_completa = $ruta . ‘/’ . $archivo;

    // Comprobamos si la ruta más file es un directorio (es decir, que file es
    // un directorio), y si lo es, decimos que es un directorio y volvemos a
    // llamar a la función de manera recursiva.
    if (is_dir($ruta_completa))
    {
    echo “Directorio: ” . $ruta_completa;
    leer_archivos_y_directorios($ruta_completa . “/”);
    }
    else
    {
    echo ” . $archivo . ”;
    }
    }
    }

    closedir($aux);

    // Tiene que ser ruta y no ruta_completa por la recursividad
    echo “Fin Directorio:” . $ruta . “”;
    }
    }
    else
    {
    echo $ruta;
    echo “No es ruta valida”;
    }
    }
    ?>

    • Hola buenas, no te preocupes que aquí estamos para ayudar. Pues a ver si entiendo tu pregunta, el código efectivamente a partir de una ruta que le pasas al llamar a la función, recorre todas las carpetas y subcarpetas y te hace un listado de todos los archivos y directorios que contienen. No entiendo muy bien que es lo que quieres modificar, simplemente copia este código en tu programa y llama a la función. Si necesitas que en lugar de escribir los directorios y los archivos, haga algo con ellos, solo has de modificar esa linea de código.
      Espero que lo entiendas, y si no es así, pregunta sin miedo.
      Un saludo.

  • buenas tardes amigo tengo una duda tengo que hacer una sección de descargas donde el administrador sube un archivo desde la pagina administrador y este aparece para descargar en la sección de descargas, no se si me di a entender, ya tengo el código que sube el archivo a una carpeta del servidor pero no se como mostrar el archivo y que salga para poderlo descarga.

    • Siento el retraso con la respuesta, pero hemos tenido mucho trabajo (no nos quejamos de ello) y poco a poco esperamos volvernos a coger. A tu pregunta, siento no poderte dar una solución sin más, depende de como lo estés haciendo. Lo haces en php plano? Usas algún framework para facilitar tu trabajo?. Para mostrar el archivo te explicamos justo en esta entrada como hacerlo. Para descargarlo hay muchos modos, pero tendríamos que saber que estás utilizando.

Deja un comentario