Problemas al subir dos imágenes

Iniciado por Rebeca, Julio 15, 2021, 04:23:49 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 15, 2021, 04:23:49 PM Ultima modificación: Julio 15, 2021, 05:23:02 PM por Gabriela
Hola .. Tengo un código copiado de internet ,,, lo que necesito es que en un solo botón de un input tipo file, me mande dos fotos y me guarde el nombre en la base de datos, pero antes de eso, me sale error.. y no se que estoy haciendo mal, ,, dejo código espero que me ayuden, gracias .
código html

Código: html5
<form action="upload.php" method="POST" id="frm-test" enctype="multipart/form-data">
<div class="mb-3 fondo">
  <label for="exampleFormControlInput1" class="form-label"><b>Elija una Imagen </b></label>
  <input type="file" class="form-control" name="file[]" multiple  >

</div>
<button type="submit" type="button" id="btn-enviar" class="btn btn-success btn-block segir_a">Seguir</button>
</form>


y el codigo de PHP
Código: php

if (isset($_FILES["file"]))
{
   $reporte = null;
     for($x=0; $x<count($_FILES["file"]["name"]); $x++)
    {
     echo  $file = $_FILES["file"];
     echo  $nombre = $file["name"][$x];
     echo  $tipo = $file["type"][$x];
    echo   $ruta_provisional = $file["tmp_name"][$x];
    echo   $size = $file["size"][$x];
    echo   $dimensiones = getimagesize($ruta_provisional);
    echo   $width = $dimensiones[0];
    echo   $height = $dimensiones[1];
     echo  $carpeta = "./FilesUploA/";

      if ($tipo != 'image/jpeg' && $tipo != 'image/jpg' && $tipo != 'image/png' && $tipo != 'image/gif')
      {
          $reporte .= "<p style='color: red'>Error $nombre, el archivo no es una imagen.</p>";
      }
      else if($size > 2024*2024)
      {
          $reporte .= "<p style='color: red'>Error $nombre, el tamaño máximo permitido es 1mb</p>";
      }
      else if($width > 2500 || $height > 2500)
      {
          $reporte .= "<p style='color: red'>Error $nombre, la anchura y la altura máxima permitida es de 500px</p>";
      }
      else if($width < 60 || $height < 60)
      {
          $reporte .= "<p style='color: red'>Error $nombre, la anchura y la altura mínima permitida es de 60px</p>";
      }
      else
      {
          $src = $carpeta.$nombre;

          //Caragamos imagenes al servidor
          move_uploaded_file($ruta_provisional, $src);       

          //Codigo para insertar imagenes a tu Base de datos.
          //Sentencia SQL

          echo "<p style='color: blue'>La imagen $nombre ha sido subida con éxito</p>";
      }
    }

    echo $reporte;
}


el erro que me sale es el siguiente.:



Desde ya muchas gracias...
Saludos
rebe

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola .. Tengo un código copiado de internet ,,, lo que necesito es que en un solo botón de un input tipo file, me mande dos fotos y me guarde el nombre en la base de datos, pero antes de eso, me sale error.. y no se que estoy haciendo mal, ,, dejo código espero que me ayuden, gracias .
código html

Código: html5
<form action="upload.php" method="POST" id="frm-test" enctype="multipart/form-data">
<div class="mb-3 fondo">
  <label for="exampleFormControlInput1" class="form-label"><b>Elija una Imagen </b></label>
  <input type="file" class="form-control" name="file[]" multiple  >

</div>
<button type="submit" type="button" id="btn-enviar" class="btn btn-success btn-block segir_a">Seguir</button>
</form>


y el codigo de PHP
Código: php

if (isset($_FILES["file"]))
{
   $reporte = null;
     for($x=0; $x<count($_FILES["file"]["name"]); $x++)
    {
     echo  $file = $_FILES["file"];
     echo  $nombre = $file["name"][$x];
     echo  $tipo = $file["type"][$x];
    echo   $ruta_provisional = $file["tmp_name"][$x];
    echo   $size = $file["size"][$x];
    echo   $dimensiones = getimagesize($ruta_provisional);
    echo   $width = $dimensiones[0];
    echo   $height = $dimensiones[1];
     echo  $carpeta = "./FilesUploA/";

      if ($tipo != 'image/jpeg' && $tipo != 'image/jpg' && $tipo != 'image/png' && $tipo != 'image/gif')
      {
          $reporte .= "<p style='color: red'>Error $nombre, el archivo no es una imagen.</p>";
      }
      else if($size > 2024*2024)
      {
          $reporte .= "<p style='color: red'>Error $nombre, el tamaño máximo permitido es 1mb</p>";
      }
      else if($width > 2500 || $height > 2500)
      {
          $reporte .= "<p style='color: red'>Error $nombre, la anchura y la altura máxima permitida es de 500px</p>";
      }
      else if($width < 60 || $height < 60)
      {
          $reporte .= "<p style='color: red'>Error $nombre, la anchura y la altura mínima permitida es de 60px</p>";
      }
      else
      {
          $src = $carpeta.$nombre;

          //Caragamos imagenes al servidor
          move_uploaded_file($ruta_provisional, $src);       

          //Codigo para insertar imagenes a tu Base de datos.
          //Sentencia SQL

          echo "<p style='color: blue'>La imagen $nombre ha sido subida con éxito</p>";
      }
    }

    echo $reporte;
}


el erro que me sale es el siguiente.:



Desde ya muchas gracias...
Saludos
rebe

Hola Rebeca.

el mismo error te lo esta diciendo. Tu en tu codigo indicas el tamaño maximo de la imagen permitida para subir

Código: php

   else if($width > 2500 || $height > 2500)



Hola, no, no es ese el error,
Gracias de todas Manera.
Saludos
Rebe

que tal rebe? mira, el error indica un problema de casteo de tipos en la linea 12 y 17 (pero no se cuales lineas son porque aquí no esta el codigo entero entonces no veo numeración para saber cuales lineas dice)

Te está diciendo el error que tienes un array y que tu lo quieres usar como string, es decir una de las variables que generaste tiene un array dentro y luego tu lo estas tratando de concatenar con un string por ejemplo (o cosa similar).

Yo creo que la linea 12 es esta:
echo  $file = $_FILES["file"];

y la linea 17 esta:
echo   $dimensiones = getimagesize($ruta_provisional);

SI te fijas estas dos variables contienen arrays (los files y las dimensiones que es x,y), y al ponerles "echo" te tiran ese notice, lo hacen 1 por cada linea y 2 veces porque subes 2 archivos (por eso hay 4 notices).

Por lo cual esos notices son irrelevantes (puedes usar var_dump en vez de echo para ver una variable),
(En resumen los notices son por usar los echos en arrays en esos casos),

entonces por que tira error de tamaño?

Noxon tiene razón el getimagesize te está devolviendo segun tu imagen este tamaño:

31204160 que es la union de los dos echos de:
echo   $width = $dimensiones[0];
echo   $height = $dimensiones[1];

Vuelvo a insistir con usar var_dump($variable) en vez de echo $variable, porque no tirará ese tipo de notices, y te dirá el tipo del dato y el valor bien separado y entendible, en este caso al tener los dos pegados no sabes cuanto es de width y cuanto es de height, si no quisieras usar var_dump puedes poner PHP_EOL para poner saltos de linea y en caso de estar puedes dar click derecho ver codigo de fuente para ver correctamente porque html no cuenta saltos de linea si no son tag <br>.

echo   $width = $dimensiones[0].PHP_EOL;

echo   $height = $dimensiones[1].'<br/>';

$height = $dimensiones[1];
var_dump($height);

pero supongamos que los tamaños son justo la mitad de tu numero: 31204160 (3120x4160) en ese caso si estarías superando el tamaño de los ifs que sería maximo 2500:

if($width > 2500 || $height > 2500) {
$reporte .= "<p style='color: red'>Error $nombre, la anchura y la altura máxima permitida es de 500px</p>";
}

te recomiendo mejorar la forma que muestras para debuguear las variables, probar de nuevo y subirnos el codigo completo para poder ver la cantidad de lineas que lleva y donde tira los notices.

Slds!, nos comentas que tal.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
que tal rebe? mira, el error indica un problema de casteo de tipos en la linea 12 y 17 (pero no se cuales lineas son porque aquí no esta el codigo entero entonces no veo numeración para saber cuales lineas dice)

Te está diciendo el error que tienes un array y que tu lo quieres usar como string, es decir una de las variables que generaste tiene un array dentro y luego tu lo estas tratando de concatenar con un string por ejemplo (o cosa similar).

Yo creo que la linea 12 es esta:
echo  $file = $_FILES["file"];

y la linea 17 esta:
echo   $dimensiones = getimagesize($ruta_provisional);

SI te fijas estas dos variables contienen arrays (los files y las dimensiones que es x,y), y al ponerles "echo" te tiran ese notice, lo hacen 1 por cada linea y 2 veces porque subes 2 archivos (por eso hay 4 notices).

Por lo cual esos notices son irrelevantes (puedes usar var_dump en vez de echo para ver una variable),
(En resumen los notices son por usar los echos en arrays en esos casos),

entonces por que tira error de tamaño?

Noxon tiene razón el getimagesize te está devolviendo segun tu imagen este tamaño:

31204160 que es la union de los dos echos de:
echo   $width = $dimensiones[0];
echo   $height = $dimensiones[1];

Vuelvo a insistir con usar var_dump($variable) en vez de echo $variable, porque no tirará ese tipo de notices, y te dirá el tipo del dato y el valor bien separado y entendible, en este caso al tener los dos pegados no sabes cuanto es de width y cuanto es de height, si no quisieras usar var_dump puedes poner PHP_EOL para poner saltos de linea y en caso de estar puedes dar click derecho ver codigo de fuente para ver correctamente porque html no cuenta saltos de linea si no son tag <br>.

echo   $width = $dimensiones[0].PHP_EOL;

echo   $height = $dimensiones[1].'<br/>';

$height = $dimensiones[1];
var_dump($height);

pero supongamos que los tamaños son justo la mitad de tu numero: 31204160 (3120x4160) en ese caso si estarías superando el tamaño de los ifs que sería maximo 2500:

if($width > 2500 || $height > 2500) {
$reporte .= "<p style='color: red'>Error $nombre, la anchura y la altura máxima permitida es de 500px</p>";
}

te recomiendo mejorar la forma que muestras para debuguear las variables, probar de nuevo y subirnos el codigo completo para poder ver la cantidad de lineas que lleva y donde tira los notices.

Slds!, nos comentas que tal.

Concuerdo con el amigo Alex, si lo que queres es mostrar esos valores en un futuro, primero ver bien como acceder a esos datos con var_dump() y después concatenar cerrando las comillas del echo con un punto.

Código: php

echo  "El nombre del archivo es : ".$nombre = $file["name"][$x]."<br>";
echo  "El archivo es tipo : ".$file["type"][$x]."<br>";


Saludos

Hola chicos, muchas gracias por sus respuestas, me ayudan mucho para seguir aprendiendo, estoy leyendo y entendiendo lo que me dicen..
Gracias, a todos por colaborar y ayudarme.  :) :)
Saludos.!
Rebe

Hola nuevamente, he cambiado un poco el código, voy lenta pero sabiendo mas o menos lo que se trata cada linea, ahora me encuentro al guardar el nombre de las imágenes que quiero que sean dos...
no me las gurda, me las guarda  si hago un insert. en columnas , pero si quiero hacer un UPDATE que es lo que necesito no me las guarda. estuve leyendo en separar el array de $_Files[].. pero no me sale
alguna sugerencia. ?
dejo el código
Código: php

if (isset($_FILES["file"]))
{
   $reporte = null;
     for($x=0; $x<count($_FILES["file"]["name"]); $x++)
    {
        $file = $_FILES["file"];
        $nombre = $file["name"][$x];
       // $cuantas=count($_FILES['file']['name']);//rebe
        $tipo = $file["type"][$x];
        $ruta_provisional = $file["tmp_name"][$x];
        $size = $file["size"][$x];
        $dimensiones = getimagesize($ruta_provisional);
        $width = $dimensiones[0];
        $height = $dimensiones[1];
        $carpeta = "images/";

   
          $src = $carpeta.$nombre;


          //Caragamos imagenes al servidor
          move_uploaded_file($ruta_provisional, $src);       


         $porciones = explode(" ", $nombre);
     var_dump( $porciones[0]); //
     var_dump(   $porciones[1]); //LINEA 33


          //Codigo para insertar imagenes a tu Base de datos.
          //Sentencia SQL
         
        //  $query="INSERT INTO indiimag (imgA) VALUE ('$nombre')";
        //  $res = mysqli_query($cone, $query);

        $query="UPDATE alumnos SET img_a=$nombre[0] , img_b=$nombre[1] WHERE ClEmail='$email')";
        $res = mysqli_query($cone, $query);








gracias por ayudarme.. saludos a todos, buenas noches.
:)

claro el problema de ahí es que tu tienes el update dentro del for, por lo que cada vez que itera se ejecuta el update y pisa los valores anteriores, te recomiendo sacar el update fuera del for pero ocurre también que en una columna solo puedes guardar un valor por registro, si tu actualizas el registro anterior le cambias el valor, solo podras guardar 1 valor, podrías guardar ambos valores concatenandolos o serializandolos, para que se guarden en la misma columna.

saludos.

Hola he realizado lo siguiente:

Código: php
$email=$_SESSION['email'];


$names = [];
$count = 0;
print_r($_FILES);
foreach ($_FILES as $file){
    if ($file['error'] == UPLOAD_ERR_OK){
        $name = $file['name'];
        $temp = $file['tmp_name'];
        $type = $file['type'];
        $size = $file['size'];

        $names[$count] = $name;
        $count++; //Se incrementa en uno cuando el archivo fue subido con éxito

        //Otras instrucciones...

        move_uploaded_file($temp, 'images/' . $name);

        if ($count == 2) break; //Se termina el bucle cuando se hayan subido dos archivos
     
    }
}


$query = "UPDATE alumnos SET img_a = '{$names[0]}', img_b = '{$names[1]}' WHERE ClEmail = '$email'"; // linea 31
$res = mysqli_query($cone, $query);


?>


el error que sale es el siguiente:

Array ( [file] => Array ( [name] => Array (
  • => 4.jpg [1] => 5.jpg ) [type] => Array (
  • => image/jpeg [1] => image/jpeg ) [tmp_name] => Array (
  • => C:\xampp\tmp\php2F3F.tmp [1] => C:\xampp\tmp\php2F50.tmp ) [error] => Array (
  • => 0 [1] => 0 ) [size] => Array (
  • => 2245406 [1] => 2463818 ) ) )
    Notice: Undefined offset: 0 in C:\xampp\htdocs\03_V.01_2021_ESTEEEE\userspublicar\CuaSaveD.php on line 31

    Notice: Undefined offset: 1 in C:\xampp\htdocs\03_V.01_2021_ESTEEEE\userspublicar\CuaSaveD.php on line 31

    Gracias,
    Saludos Rebe