Inicio Apuntes FPApuntes DAW MultiUpload con una clase y algunas funciones
php logo

MultiUpload con una clase y algunas funciones

por entreunosyceros
Publicado el: Última actualización:
AVISO: Esta entrada tiene más de dos años desde su publicación. Es posible que el contenido esté desactualizado.

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 instanciació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.


También te puede interesar ...

2 Comentarios

Sandra_Gil 20 junio, 2016 - 4:26 PM

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

Responder
sapoclay 21 junio, 2016 - 12:40 AM

Me alegra que te fuese útil. Si lo cuelgo es para compartirlo. Salu2 y gracias por la visita.

Responder

Deja tu comentario

* Al utilizar este formulario, acepta que este sitio web almacene y maneje sus datos.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.