Error uploading files using PHP

0

Whatever I do, I always get the error:

//echo "Ha ocurrido un error. Inténtelo de nuevo...";

And yes, I have the Xampp on with the Apache and MySQL.

HTML Code:

<form action="<?php echo $_SERVER['PHP_SELF'];?>" enctype="multipart/form-data" name="anadir_cabana" id="anadir_cabana" method="POST" onsubmit="return validar_formulario_cabana();">
<label for="imagen">Imagen:</label>
    <input type="file" multiple="multiple" name="imagen[]" required /> 
</form>

PHP Code:

   //Subir el nombre de una imagen. $_FILES: Variables de subida de ficheros HTTP.
        if (!isset($_FILES["imagen"]) || $_FILES["imagen"]["error"] > 0){
            echo "<script type='text/javascript'>alert('Ha ocurrido un error. Inténtelo de nuevo...');</script>";
            //echo "Ha ocurrido un error. Inténtelo de nuevo...";
        }else{
            $cantidad=count($_FILES["imagen"]["tmp_name"]);
                for ($i=0; $i<$cantidad; $i++){
                //Comprobamos si la extensión el fichero es de tipo imagen y menor de 16MB.
                $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
                $limite_kb = 16384;
                //Si la extensión del fichero a subir, coincide con la de permitidos...
                if (in_array($_FILES['imagen']['type'][$i], $permitidos) && $_FILES['imagen']['size'][$i] <= $limite_kb * 1024){
                    //Guardamos la imagen como archivo local en "$imagen_temporal". [tmp_name] sería para archivo temporal (carpeta tmp de Xampp).
                    $imagen_temporal = $_FILES['imagen']['name'][$i];

                    //Tipo de extensión.
                    $tipo = $_FILES['imagen']['type'][$i];

                    //Escapamos los caracteres para que se puedan almacenar en la base de datos correctamente.
                    //$imagen_temporal = mysql_escape_string($imagen_temporal);
                    $ruta_imagen = $imagen_temporal; 

                    //Insertamos en la base de datos.
                    $sql = BD::anadirImagenCabana($ruta_imagen, $idcabana);
                }else{
                    echo "<script type='text/javascript'>alert('Formato de archivo no permitido o excede el tamaño límite de $limite_kb Kbytes.');</script>";
                }
            }
        }
    
asked by omaza1990 12.01.2018 в 19:59
source

1 answer

2

When uploading several files the variable $_FILES becomes an array, so the validation !isset($_FILES["imagen"]) will always be true. There are several ways to resolve your question, in this example in the documentation suggest the following

foreach ($_FILES["imágenes"]["error"] as $clave => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $nombre_tmp = $_FILES["imágenes"]["tmp_name"][$clave];
        // basename() puede evitar ataques de denegació del sistema de ficheros;
        // podría ser apropiado más validación/saneamiento del nombre de fichero
        $nombre = basename($_FILES["imágenes"]["name"][$clave]);
        move_uploaded_file($nombre_tmp, "datos/$nombre");
    }
}

For your specific case we could do a prior validation

$todoBien = true;
foreach ($_FILES["imagen"]["error"] as $clave => $error) {
    if ($error != UPLOAD_ERR_OK) {
        $todoBien = false
    }
}

if ($todoBien) {
    foreach ($_FILES["imagen"]["error"] as $clave => $error) {
        //Comprobamos si la extensión el fichero es de tipo imagen y menor de 16MB.
        $permitidos = array("image/jpg", "image/jpeg", "image/gif", "image/png");
        $limite_kb = 16384;
        //Si la extensión del fichero a subir, coincide con la de permitidos...
        if (in_array($_FILES['imagen']['type'][$clave], $permitidos) && $_FILES['imagen']['size'][$clave] <= $limite_kb * 1024){
            //Guardamos la imagen como archivo local en "$imagen_temporal". [tmp_name] sería para archivo temporal (carpeta tmp de Xampp).
            $imagen_temporal = $_FILES['imagen']['name'][$clave];

            //Tipo de extensión.
            $tipo = $_FILES['imagen']['type'][$clave];

            //Escapamos los caracteres para que se puedan almacenar en la base de datos correctamente.
            //$imagen_temporal = mysql_escape_string($imagen_temporal);
            $ruta_imagen = $imagen_temporal; 

            //Insertamos en la base de datos.
            $sql = BD::anadirImagenCabana($ruta_imagen, $idcabana);
        }else{
            echo "<script type='text/javascript'>alert('Formato de archivo no permitido o excede el tamaño límite de $limite_kb Kbytes.');</script>";
        }
    }
} else {
    echo "<script type='text/javascript'>alert('Ha ocurrido un error. Inténtelo de nuevo...');</script>";
}

It should be noted that many times it is not enough to validate the file extension, you can use getimagesize to be able to perform a more specific validation

As I said there are several ways to solve the problem, this is just one of them

    
answered by 12.01.2018 / 20:37
source