¿Quieres registrarte?

Listar archivos de un directorio web con PHP y XML

Por: Zguillez
27 de Octubre del 2008

Este es un sencillo script de PHP que nos permite generar un archivo XML con el listado de todos los archivos y carpetas que esten contenidos dentro del directorio en el que hemos situado el archivo PHP.

Esto nos puede resultar útil para realizar galerías fotográficas en las que queremos acceder a todas las imágenes de un directorio y queremos poder subir o borrar archivos. El archivo XML siempre estará actualizado a los ficheros del servidor.

El archivo PHP es el siguiente. Lo llamaremos list.php y lo subiremos al servidor dentro de la carpeta que nos interese listar.

Código :

<?php
   $dir = "./";
   
   echo "<XML encoding='UTF-8' standalone='yes' version='1.0'>\n";
   echo "  <folder>\n";
   
   if (is_dir($dir))
   {
       if ($gd = opendir($dir))
      {
           while (($archivo = readdir($gd)) !== false)
         {
            if ($archivo != "." & $archivo != ".." & $archivo != "list.php")
            {
               if (is_dir($archivo))
               {
                     echo "    <folder>$archivo</folder>\n";
               }
               else
               {
                     echo "    <file>$archivo</file>\n";
               }
            }
           }
           closedir($gd);
       }
   }
   
   echo "  </folder>\n";
   echo "</XML>\n";
?>

El script lo único que hace es recorrer todos los elementos de la carpeta en la que está situado y a base de "echos" formatea el XML.

Si visualizamos este archivo desde el navegador y miramos el código resultante este sería un archivo XML de este estilo:

Código :

<XML encoding='UTF-8' standalone='yes' version='1.0'>
  <folder>
    <file>img_001.jpg</file>
    <file>img_002.jpg</file>
    <file>img_003.jpg</file>
    <file>img_004.jpg</file>
    <file>img_005.jpg</file>
    <folder>thumbs</folder>
    <folder>hires</folder>
  </folder>
</XML>


De esta manera si quisiésemos, por ejemplo, listar el contenido de imágenes disponibles de este directorio dentro de un componente List de Flash haríamos lo siguiente:

Código :

import fl.data.DataProvider;

var _URLLoader = new URLLoader();
var _URLRequest = new URLRequest();

_URLRequest.url = "/img/list.php";
_URLLoader.load(_URLRequest);
_URLLoader.addEventListener(Event.COMPLETE, onListComplete);

function onListComplete(e:Event):void
{
   var xml:XML = new XML(e.target.data);
   var xmlList:XMLList = xml.folder.file;
   var dataProvider = new DataProvider();
   for each (var item in xmlList)
   {
      dataProvider.addItem({label:item});
   }
   listado.dataProvider = dataProvider;
}


Cargamos el archivo PHP como si de un XML se tratase, y de ahí lo convertimos en el dataProvider del componente.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas flash php xml actionscript_3 componente

Comentarios | Enviar un comentario
Que buenísimo! Me parece muy práctico, en serio. Una vez más...Muchas gracias Z. Me quito el sombrero U_U
Por: Carmen
Genial.

De todas formas hay una forma de insertar tabulaciones sin tener que usar el "espacio", lo que ahora no recuerdo cual era. :P
Por: Bleend

Bleend-blog :

Genial.

De todas formas hay una forma de insertar tabulaciones sin tener que usar el "espacio", lo que ahora no recuerdo cual era. :P

Si, es con \t

Código :

echo "\t<file>$archivo</file>\n"; 

Por: Zguillez
Hace poco quise hacer algo similar y creo que, aunque al final conseguí lo que quería, lo hice de manera un poco más complicada. Yo tenía un código similar a este, pero en vez de crear el xml a base de echo, tomaba un xml vacío y generaba otro con el contenido de las imágenes de la carpeta. Pero claro, ahora necesitaba que el xml estuvise actualizado para cuando fuese llamado, por lo que me tuve que crear un php padre, que fuese recorriendo todos los php y ejecutándolos allá dónde estén para que actualicen todos los xml, este php padre era ejecutado desde flash cada vez que se accedía a la web y así todo se actualizaba. Creo ahora, que haciéndolo como muestras, me hubiese ahorrado este php padre, no?? ya que el php se ejecuta y actualiza en el momento en que es llamado desde flash como si de un xml se tratase. Bueno, si quieren darle sentido a esto que os comento, os dejoaqui el enlace en el que planteé y me ayudaron a resolver el problema en cuestión.
Por: Noja33
Muy buen ejemplo Z, es algo ampliamente útil. Sólo añadiría una línea al principio:
header("content-type: text/xml");
Por lo demás es estupendo, saludos!!!
Por: Tata
Es muy bueno, yo utilice algo parecido para crear un mini CMS en flash, éste utiliza el listado de fotos en cada carpeta como si fuera una pequeña base de datos. El sitio en cuestion es regaloschihuahua.com. Desafortunadamente despues me di cuenta que con MySQL hubiera sido más sencillo, pero al menos el que utiliza listado php-xml funciona perfectamente. Excelente tip!
Por: lemostro
Muy bueno, Z, enhorabuena.
Sólo una par de cosas que creo que podría mejorarlo:
Podrías hacer que el directorio fuese un parámetro, lo que te da mucha más flexibilidad para hacer los listados, por ejemplo si necesitas varias galerías de imágenes o listas:

Código :

$dir = $_GET["dir"] . "/";
...

y envías la url con la dirección que requieres:

Código :

_URLRequest.url = "/img/list.php?dir=img";

De esta forma, ni siquiera haría falta que el archivo estuviese en la misma carpeta.
Por: The Fricky!
Muy bueno, yo le sacaría la función is_dir ya que es un directorio si o si, salvo que se use como dice The Fricky.

pd: Alguien sabe que es más rápido:
Parsear un XML o hacer una consulta a una MySql ? Siempre tuve esa duda, a veces soy muy perseguido y para no sobrecargar al servidor con datos que no varían seguido entonces genero los xml con php de forma similar al ej. de Z y que los lea flash.
Por: Raxiro-blog

Raxiro-blog :

Alguien sabe que es más rápido:
Parsear un XML o hacer una consulta a una MySql ? Siempre tuve esa duda, a veces soy muy perseguido y para no sobrecargar al servidor con datos que no varían seguido entonces genero los xml con php de forma similar al ej. de Z y que los lea flash.
Invariablemente será más rápido consultar MySQL que parsear un XML. MySQL es una base de datos organizada con un formato indexado y especialmente diseñado para ser consultado.

XML es un archivo de texto.

Otra cosa distinta es generar "cache" estático de las consultas o HTML estático de las salidas para mejorar el rendimiento. Lo que tu haces con los XML es similar a eso. Por otro lado, en el caso de Flash no tienes opción, sea que hagas la consulta o no vas a tener que parsear el XML. Pero eso se hace del lado del cliente.
Por: Freddie
Gracias Freddie por la respuesta, nunca supieron bien que responder las personas a las que les pregunte esto :P
saludos
Por: Raxiro-blog
Con este script se puede guardar el resultado en un Array?
La verdad es que he intentado y no me sale :P
Por: CarlosRuminott

CarlosRuminott :

Con este script se puede guardar el resultado en un Array?
La verdad es que he intentado y no me sale :P

Si claro.. Lo único que has de hacer cambiar el new DataProvider(); por un new Array(); y tambien cambiar el addItem() por un push().. y listo ;)
Por: Zguillez
Muchas gracias Zguillez.
Pero a lo que me refería era a llenar un array en el mismo PHP, y al final lo logre :P
dejo el código por si le sirve a alguien ^^

Código :

<?php 
   $dir = "./";
   $imagenes = array();
   if (is_dir($dir)) 
   { 
       if ($gd = opendir($dir)) 
      { 
           while (($archivo = readdir($gd)) !== false) 
         { 
            if ($archivo != "." & $archivo != ".." & $archivo != "list.php") 
            { 
               if (is_dir($archivo)) 
               { 
                     echo '    <folder>$archivo</folder>\n'; 
               } 
               else 
               { 
                $imagenes[] = $archivo;
               } 
            } 
           } 
           closedir($gd); 
       } 
   }
?>


Era tan simple y no me salia U_U
Por: CarlosRuminott
Hola amigos de cristalab, Zguillez, veo que este script es fácil de utilizar ya que todos lo dicen, pero la verdad es que copio el código en un archivo php, lo ejecuto dentro de la carpeta que necesito pero no me genera ningún xml.... no me sale ningún error, no se si hay que modificar algo en el código, dar algún permiso al archivo o a la carpeta o debe exisitit previamente un xml???? Si me pueden ayudar lo agradecería porque es algo que necesito implementar en una web para poder finalizarla? gracias por la ayuda y respuestas?
Por: Julian-blog
Jajaja,......esta buenisimo Claro q seria bueno q enviaras un ejemplo!!!
pero gracias
Por: sforero
Que pena molestar, pero esque probando esto......No se como vincularlo con Flash, pues ya me da los archivos que tengo, es decir ya me funciona. Pero no se como vincular la informacion con flash, aqui esta mi php http://www.sforero.net/beta/list.php
Por: sforero
Como mismo lees un fichero XML externo en flash, pero utiliza la ruta de este php en vez de la ruta de un fichero XML físico.
Por: elchininet
El XML se genera bien, solo que me ordena aleatoriamente los archivos, hay alguna forma de que los ordene por fecha, asi los mas nuevos quedarian primero.?????
Por: jovix-blog
@jovix, quizás esto te sirva para lo que buscas.
Por: elchininet
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.