Leer los archivos en un directorio.
Resumen.
Una tarea bastante frecuente en la inmensa mayoría de los sitios Web consiste en extraer los nombres de los archivos contenidos en él. Los motivos tan diversos como presentar una galería de fotos o impedir que más archivos sean publicados cuando se ha ocupado un determinado espacio Web. En este artículo nos limitaremos a leer los archivos que nos interesan y veremos algunas cositas más que podemos hacer.Artículo.
En este artículo, a mi modo de ver muy interesante, vamos a ver como solo con tener un directorio que contiene fotos por ejemplo, podemos realizar ciertas tareas de manera muy sencilla, como por ejemplo, mostrar esas fotos.
Para acceder a los contenidos de un directorio o carpeta debemos acceder a cada uno de los elementos contenidos en él, como el lector ya podrá imaginar, para esto vamos a necesitar un bucle y un array sobre el que actúe este bucle.
Para crear un array con los archivos contenidos en un directorio podemos usar la función glob(), que puede recibir uno o dos parámetros:
Así ya tenemos un array con los archivos contenidos en este directorio, ahora solo queda recorrer este array mediante un bucle, y usaremos el bucle foreach(), con esto, nuestro código quedaría de la siguiente forma:
Estas dos particularidades son precisas para que el código funcione en mi servidor local, aunque también funciona en el servidor remoto. Pero en el servidor remoto puedo hacer esto:
Hecha esta puntualización, continuamos con el código. En el bucle foreach() hemos creado los siguientes arrays partiendo del array $archivos_tipo:
$volumen.- mediante la función filesize() hemos calculado el tamaño de cada archivo, esta función lo devuelve en btis, por lo que ha sido transforma a Kb y redondeado a dos decimales con la función round().
$link.- hemos creado un enlace desde el nombre de la foto a la foto en cuestión.
$link_fotos.- hemos presentado la imagen en tamaño reducido y enlazamos la foto en su tamaño original.
Con estos 4 arrays y mediante la función array_combine() hemos creado nuevos array que combinan diferentes keys y valores de los arrays creados.
Mediante la función count() hemos contado el número de archivos, y hemos calculado el volumen de todos ellos mediante la función array_sum(), que suma los valores de un array.
Este código lo podemos convertir en función de la siguiente manera:
Y esto es todo amigos, espero que os haya gustado este artículo.
Para acceder a los contenidos de un directorio o carpeta debemos acceder a cada uno de los elementos contenidos en él, como el lector ya podrá imaginar, para esto vamos a necesitar un bucle y un array sobre el que actúe este bucle.
Para crear un array con los archivos contenidos en un directorio podemos usar la función glob(), que puede recibir uno o dos parámetros:
El primer parámetro hace referencia al directorio que se va a leer unido al tipo de archivos que queremos que se lean, donde * indica “cualquier cosa delante de un punto” al que sigue la extensión del archivo (jpg, gif, zip…) tras el punto guardada en la variable $Tipos. El segundo parámetro es un flags (o bandera), que condicionará el funcionamiento de la función, en este caso GLOB_BRACE.glob($directorio."*.$Tipos", GLOB_BRACE);
Así ya tenemos un array con los archivos contenidos en este directorio, ahora solo queda recorrer este array mediante un bucle, y usaremos el bucle foreach(), con esto, nuestro código quedaría de la siguiente forma:
Vamos ahora a comentar las particularidades de este código. La primera es la forma de denominar el directorio que contiene nuestros archivos. $directorio = 'fotos/'; debe terminar en /, ya que de lo contrario fallaría la ruta “fotos/mi_foto.jpg”. La segunda es la denominación de las extensiones de archivo que queremos mostrar y recogemos en $Tipos = '{png,jpg,jpeg,jfif,gif}'; Como podemos observar las extensiones van entre llaves {} sin punto y separadas por comas “,” y SIN ningún espacio entre ellas. El punto “.” se agrega en "*.$Tipos". Agregar que si queremos que se muestren todos los archivos existentes en el directorio debemos sustituir las extensiones por un asterisco “*”, es decir, $Tipos = '{*}';.<?php // Muestra los archivos con unas determinadas extensiones almacenados // en una carpeta o directorio // Directorio que contiene los archivos $directorio = 'fotos/'; // Para mostrar varios tipos de archivos // No agregar espacios en blanco en {png,jpg,jpeg,jfif,gif} $Tipos = '{png,jpg,jpeg,jfif,gif}'; // Con {*} muestra todos los archivos existentes $archivos_tipo = glob($directorio."*.$Tipos", GLOB_BRACE); foreach($archivos_tipo as $key => $fotos){ $volumen[$key] = round(filesize($fotos) / 1024, 2); $ruta_arch[$key] = explode('/', $fotos); $nombre[$key] = $ruta_arch[$key][1]; $link[$key] = "<a href=\"$fotos\">$fotos</a>"; $link_fotos[$key] = "<a href=\"$fotos\"><img src=\"$fotos\" width=\"250\" alt=\"Fotos con enlace\" /></a>"; } $mis_fotos = array_combine($archivos_tipo, $volumen); $enlaces = array_combine($volumen, $link); KSORT($enlaces); // Orden por key ascendente // Contamos los archivos y calculamos el espacio total que ocupan $n_fotos = count($archivos_tipo); $kb_fotos = array_sum($volumen); $mb_fotos = round($kb_fotos / 1024, 2); echo '<pre>'; print_r($nombre); echo '</pre>'; echo '<pre>'; print_r($archivos_tipo); echo '</pre>'; echo '<pre>'; print_r($volumen); echo '</pre>'; echo '<pre>'; print_r($mis_fotos); echo '</pre>'; echo '<pre>'; print_r($link); echo '</pre>'; echo '<pre>'; print_r($enlaces); echo '</pre>'; echo "<p>Las $n_fotos fotos ocupan un total de $kb_fotos Kb.<br /> En Megabytes $mb_fotos Mb</p>"; echo '<pre>'; print_r($link_fotos); echo '</pre>'; ?>
Estas dos particularidades son precisas para que el código funcione en mi servidor local, aunque también funciona en el servidor remoto. Pero en el servidor remoto puedo hacer esto:
Con esto$Tipos = 'png,jpg,jpeg,jfif,gif';
El motivo por el que esto ocurre, lo desconozco, dado que en ambos servidores esta instalada la misma versión de PHP7, la diferencia debe estar en algún parámetro de configuración, que como he dicho, desconozco cual es.glob($directorio . "*.{\$Tipos}", GLOB_BRACE);
Hecha esta puntualización, continuamos con el código. En el bucle foreach() hemos creado los siguientes arrays partiendo del array $archivos_tipo:
$volumen.- mediante la función filesize() hemos calculado el tamaño de cada archivo, esta función lo devuelve en btis, por lo que ha sido transforma a Kb y redondeado a dos decimales con la función round().
$link.- hemos creado un enlace desde el nombre de la foto a la foto en cuestión.
$link_fotos.- hemos presentado la imagen en tamaño reducido y enlazamos la foto en su tamaño original.
Con estos 4 arrays y mediante la función array_combine() hemos creado nuevos array que combinan diferentes keys y valores de los arrays creados.
Mediante la función count() hemos contado el número de archivos, y hemos calculado el volumen de todos ellos mediante la función array_sum(), que suma los valores de un array.
Este código lo podemos convertir en función de la siguiente manera:
En este caso hemos elegido devolver el array que da el nombre de archivo y su volumen, también podíamos haberlos devuelto todos los array, pero solo hemos devuelto uno para simplificar el código y poder verlo todo mas claro.<?php /* Función que muestra los archivos con unas determinadas extensiones almacenados en una carpeta o directorio */ function ArchivosDir($directorio, $Tipos){ $archivos_tipo = glob($directorio."*.$Tipos", GLOB_BRACE); foreach($archivos_tipo as $key => $fotos){ $volumen[$key] = round(filesize($fotos) / 1024, 2); } $mis_fotos = array_combine($archivos_tipo, $volumen); return $mis_fotos; } // Aplicamos la funcion // Directorio que contiene los archivos $directorio = 'fotos/'; // Para mostrar varios tipos de archivos // No agregar espacios en blanco en {png,jpg,jpeg,jfif,gif} $Tipos = '{png,jpg,jpeg,jfif,gif}'; // Con {*} muestra todos los archivos existentes $mis_archivos = ArchivosDir($directorio, $Tipos); echo '<pre>'; print_r($mis_archivos); echo '</pre>'; ?>
Y esto es todo amigos, espero que os haya gustado este artículo.
Tags: Directorio || archivos || listar || volumen || glob || función