Tabla de contenido
Después de unos cuantos días un poco desconectado de esto, aquí estamos otra vez. Después de la desconexión, me he propuesto cambiar algunas cosas en una web que he montado. La primera versión de la web, está hecha con mysql. Pero resulta que la «cliente» la quería con mysqli o con PDO. Una vez enterado de esto, he tenido que rehacer parte de la web. Con esto algunas de las cosas que había programado he tenido que cambiarlas.
En su mayoría los cambios han sido mínimos. A la hora de subir las imágenes a esta web, me he decidido a tratar las imágenes que cada usuario registrado puede subir como un array. Pensaba que me ahorraría líneas escritas de código, pero una vez terminada la verdad es que no he ahorrado nada. Además del formulario de turno HTML, he tenido que escribir también la parte de la instanlación y esas cosas. También he tenido que reescribir la clase con sus respectivas funciones para controlar el tamaño y la extensión de los archivos que el usuario de turno sube. También se controla la ya posible existencia de una imagen con el mismo nombre. Si esto ocurre se renombrará buscando un nombre que no exista en la carpeta donde se están guardando las imágenes.
Bueno, el caso es que en principio este pequeño ejercicio lo he realizado a parte (pensando ya en dejarlo aquí colgado para el que necesite de el). Pero que cuando lo he integrado en la web, lo he tenido que modificar un poco (únicamente para mostrar los mensajes de subida o de error). No es nada del otro mundo, pero para dejar contenta a la «cliente» he perdido un poco el tiempo con esto. Si se quiere ver el funcionamiento de este pequeño «MultiUpload», solo hay que hacer click aquí.
El ejercicio consta de tres archivos, los cuales se podrán ver a continuación totalmente comentados por si surge alguna duda. Es evidente que seguro que se podrá hacer de mejor manera, pero a mi me vale tal y como está. Ahora vamos al turrón del asunto, el código de cada archivo.
Código del MultiUpload con PHP:
index.php
<html> <head> <meta charset="utf-8"> <title>Multiple uploads con php</title> </head> <body> <form action="subir.php" method="post" accept-charset="utf-8" enctype="multipart/form-data"> <label>Archivo 1:</label><input type="file" name="userfile[]" /><br /><br /> <label>Archivo 2:</label><input type="file" name="userfile[]" /><br /><br /> <label>Archivo 3:</label><input type="file" name="userfile[]" /><br /><br /> <label>Archivo 4:</label><input type="file" name="userfile[]" /><br /><br /> <input type="submit" value="Subir imágenes" /> </form> <a href="Subidas/" title="Abrir carpeta de subidas" target="_blank">Ver los archivos Subidos</a> </body> </html>
subir.php
<?php //solo se puede acceder si es una peticion post if ($_SERVER['REQUEST_METHOD'] == 'POST') { //llamamos a la clase multiupload require_once("multiupload.php"); //array de campos file del formulario $files = $_FILES['userfile']['name']; //creamos una nueva instancia de la clase multiupload $upload = new Multiupload(); //llamamos a la funcion upFiles y le pasamos el array de campos file del formulario $isUpload = $upload->upFiles($files); }else{ throw new Exception("Error Processing Request", 1); }
MultiUpload.php
<?php class Multiupload { /** *sube archivos al servidor a través de un formulario *@access public *@param array $files estructura de array con todos los archivos a subir */ public function upFiles($files = array()) { //inicializamos un contador para recorrer los archivos $i = 0; //si no existe la carpeta files la creamos if(!is_dir("Subidas/")) mkdir("Subidas/", 0777); //recorremos los input files del formulario foreach($files as $file) { //si se está subiendo algún archivo en ese indice if($_FILES['userfile']['tmp_name'][$i]) { //separamos los trozos del archivo, nombre extension $trozos[$i] = explode(".", $_FILES["userfile"]["name"][$i]); //obtenemos la extension $extension[$i] = end($trozos[$i]); //si la extensión es una de las permitidas if($this->checkExtension($extension[$i]) === TRUE) { //comprobamos si el archivo existe o no, si existe renombramos //para evitar que sean eliminados $_FILES['userfile']['name'][$i] = $this->checkExists($trozos[$i]); //comprobamos si el archivo ha subido if(move_uploaded_file($_FILES['userfile']['tmp_name'][$i],"Subidas/".$_FILES['userfile']['name'][$i])) { echo "subida correctamente"; //aqui podemos procesar info de la bd referente a este archivo } //si la extension no es una de las permitidas }else{ echo "la extension no esta permitida"; } //si ese input file no ha sido cargado con un archivo }else{ echo "sin imagen"; } echo "<br />"; //en cada pasada por el loop incrementamos i para acceder al siguiente archivo $i++; } } /** *funcion privada que devuelve true o false dependiendo de la extension - si esta o no permitido el tipo de archivo *@access private *@param string *@return boolean */ private function checkExtension($extension) { //aqui podemos añadir las extensiones que deseemos permitir $extensiones = array("jpg","png","gif","pdf"); if(in_array(strtolower($extension), $extensiones)) { return TRUE; }else{ return FALSE; } } /** *funcion que comprueba si el archivo existe, si es asi, iteramos en un loop *y conseguimos un nuevo nombre para el, finalmente lo retornamos - archivo con el nuevo nombre *@access private *@param array *@return array */ private function checkExists($file) { //asignamos de nuevo el nombre al archivo $archivo = $file[0] . '.' . end($file); $i = 0; //mientras el archivo exista entramos while(file_exists('Subidas/'.$archivo)) { $i++; $archivo = $file[0]."(".$i.")".".".end($file); } //devolvemos el nuevo nombre de la imagen, si es que ha //entrado alguna vez en el loop, en otro caso devolvemos el que //ya tenia return $archivo; } }
Hasta aquí el ejercicio, solo me queda como siempre aclarar, que para cualquier duda o donación, están los comentarios para ello.
2 Comentarios
Este ejemplo me ha venido muy bien. Es un ejercicio de Desarrollo Web en entorno servidor que me tenía frito. Te lo copio sin no te importa. Gracias por compartir
Me alegra que te fuese útil. Si lo cuelgo es para compartirlo. Salu2 y gracias por la visita.