Foros del Web » Programando para Internet » PHP »

PHP OO Imagen repetida al subir a servidor, upload fotos

Estas en el tema de Imagen repetida al subir a servidor, upload fotos en el foro de PHP en Foros del Web. Hola comunidad, junto con saludarlos, queria consultarles por este problema, actualmente tengo un script para subir fotos de noticias (hasta 5 fotos por noticia), pero ...
  #1 (permalink)  
Antiguo 21/08/2014, 17:03
 
Fecha de Ingreso: noviembre-2010
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Imagen repetida al subir a servidor, upload fotos

Hola comunidad, junto con saludarlos, queria consultarles por este problema, actualmente tengo un script para subir fotos de noticias (hasta 5 fotos por noticia), pero me encuentro con el problma que me sube las imagenes repetidas, o sea,si cargo 2 imagenes, me inserta las mismas 2...este es mi codigo actual:

Código PHP:
require_once '../Inc/funciones.php';                                                                
                                                                
$obj = new Avisos();                                                                
                                                                
if(isset(
$_POST['enviar'])){                                                                
                                                                            
        
//Validamos que no sean ams de 5 imagenes las que se cargaron
 
        
if(!sizeof($_FILES['fotosavisos']['name']) > 5){                                                                 
                                                                    
        echo 
'ha cargado mas de 5 fotos';                                                                
                                                                        
    }else{                                                                 
               
//Aca es donde deberia colocar el codigo que se encarga de sbuir las imagenes?                                                                
                                                                       
                                                                           
                
for($i=1;$i <= 5;$i++){                                                                
                    if(!empty(
$_FILES['fotosavisos']['name'][$i])){                                                                 
                        
//echo $i;
 
                                                                                            
                        
$rutas = array(''''); // Inicializas con dos rutas vacías 
 //Subida de Archivos                                                                
                           
foreach($_FILES['fotosavisos']['tmp_name'] as $key => $nombresTemporal)                                                                
                           {
  
                               
//asignamos un nombre unico para que no se repita si el nombre de la  imagen ya existe en el servidor
 //$nombreUnico=  md5( time());                                                                
                                                                
                                                                
                               //Nombre del Arreglo generado con el input fotosavisos                                                                
                               
$nombres=$_FILES['fotosavisos']['name'][$key];                                                                
                                                                
                               
//Obtenemos la extension del archivo                                                                
                               //$nombreUnico=substr(md5($nombres),0 , 10);                                                                
                                                                
                               //$nombres= preg_replace('#[^a-z.0-9]#i', '', $nombres);                                                                
                                                                
                               //Nombre Temporal de la Imagen (Generada por el servidor)                                                                
                               
$nombresTemporal=$_FILES['fotosavisos']['tmp_name'][$key];                                                                
                                       
//Tamaño de la Imagen                                                                
                               
$tamaño=$_FILES['fotosavisos']['size'][$key];                                                                
                                       
//Tipo de Imagen                                                                
                               
$tipo=$_FILES['fotosavisos']['type'][$key];                                                                
                                                                
                               
//Ruta en Servidor                                                                
                              
$rutaFinal="../imagenes_avisos/".$nombres;                                                                
                              
$rutaFinalSQL="imagenes_avisos/".$nombres//VALIDAR QUE ESTA RUTA EXISTA                                                                
                                                                
                           //Movemos los Archivos al Servidor                                                                
                           
move_uploaded_file($nombresTemporal,$rutaFinal);                                                                
                                                                
                           
// Actualizas la ruta correspondiente para este archivo                                                                
                           
$rutas[$key] = $rutaFinalSQL;
 
                                                                
                       }
//foreach                                                                 
                                                                
                    
}//if empty                                                                
                                                                                    
                
}//for                                                                  
                                                                            
    
}//else post                                                                
                                                                        
            
try{                                                                
                                                                
                
$obj->insertarAvisos($rutas);                                                                
                    
//print_r($_POST); 
}catch(PDOException $e){                                                                
                echo 
$e;                                                                
            }                                                                
                                                                
}
// if post 
tengo sospechas que el problema puede estar en el tema del nmbre y la extension, o en el for, pero hice varios cambiso y no me funciona...


Saludos a todos y gracias por su ayuda
  #2 (permalink)  
Antiguo 21/08/2014, 23:33
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Imagen repetida al subir a servidor, upload fotos

Noto inconsistencia en tu código, por ejemplo, el subíndice 'tmp_name' no es un array como para que lo intentes recorrer con un bucle, además, iteras cinco veces en el bucle cuando quizá no siempre se vayan a seleccionar cinco archivos.

Yo lo haría así:

Código HTML:
Ver original
  1. <form action = "upload.php" method = "post" enctype = "multipart/form-data">
  2.     Selecciona las imágenes: <input type = "file" name = "myFiles[]" multiple accept = "image/jpeg, image/png, image/gif" />
  3.     <input type = "submit" />
  4. </form>

Código PHP:
Ver original
  1. $files = $_FILES['myFiles'];
  2. $total = count($files['name']);
  3. $max_file_uploads = ini_get('max_file_uploads');
  4. $post_max_size = (int)ini_get('post_max_size');
  5. $upload_max_filesize = (int)ini_get('upload_max_filesize');
  6. $totalUploaded = 0;
  7. $types = array('image/jpeg', 'image/png', 'image/gif');
  8.  
  9. if ($total){
  10.     foreach ($files['size'] as $size) $totalUploaded += $size;
  11.     $totalUploaded /= 1048576;
  12.  
  13.     if ($total <= $max_file_uploads && $totalUploaded <= $post_max_size){
  14.         for ($i = 0; $i < $total; $i++){
  15.             $error = $files['error'][$i];
  16.             $size = $files['size'][$i] / 1048576;
  17.             $tmp_name = $files['tmp_name'][$i];
  18.             $name = $files['name'][$i];
  19.             $type = getimagesize($tmp_name)['mime'];
  20.  
  21.             if ($error == UPLOAD_ERR_OK && $size <= $upload_max_filesize && in_array($type, $types)){
  22.                 if (move_uploaded_file($tmp_name, 'img/' . $name)){
  23.                     echo 'El archivo ' . $name . ' ha sido subido<br />';
  24.                 }
  25.                 else{
  26.                     echo 'No se pudo subir el archivo ' . $name . '<br />';
  27.                 }
  28.             }
  29.             else{
  30.                 echo 'No se pudo subir el archivo ' . $name . ', su tamaño excede el límite o no es un archivo de imagen<br />';
  31.             }
  32.         }
  33.     }
  34.     else{
  35.         echo 'La cantidad de archivos seleccionados supera al máximo permitido o el tamaño combinado de los archivos seleccionados supera al tamaño máximo permitido';
  36.     }
  37. }
  38. else{
  39.     echo 'No has seleccionado archivos';
  40. }

Lo que hago es lo siguiente. Primero, en el formulario, tengo un <input> de tipo file, con nombre myFiles[] con corchetes para tratarlo como un array y en el archivo PHP, tomar los archivos seleccionados utilizando una estructura repetitiva y además, los atributos multiple para poder tomar a más de un archivo y accept con el que defino los tipos de archivo que el usuario podrá seleccionar, aunque puede cambiarse esto manualmente. Luego, en el archivo PHP, defino a las siguientes variables:
  • $files: Le asigno el array de archivos.
  • $total: El total de archivos subidos.
  • $max_file_uploads: La cantidad máxima de archivos que se permite subir al servidor.
  • $post_max_size: El tamaño combinado máximo de bytes que se permite subir al servidor.
  • $upload_max_filesize: El tamaño máximo de bytes por archivo que se permite subir al servidor.
  • $totalUploaded: Variable que originalmente tiene como valor 0 y que más adelante albergará la cantidad total de bytes sumados de todos los archivos seleccionados.
  • $types: Un array con los tipos de archivo permitidos.

Definido esto, verifico si se han seleccionado archivos, de ser así, procedo con las operaciones, caso contrario, muestro un mensaje indicándole al usuario que no ha seleccionado archivos. De darse el primer caso (que es el que obviamente esperamos), recorro la lista de valores con los tamaños de los archivos seleccionados y los voy acumulando en la variable $totalUploaded, cuyo valor final divido entre 1048576 (cantidad de bytes en un Megabyte) para obtener el equivalente en Megabytes. Luego, verifico que la cantidad de archivos seleccionados sea menor o igual al máximo permitido y que la cantidad total de Megabytes subidos entre todos los archivos seleccionados sea menor o igual a lo que permite el servidor, de cumplirse esto, procedo a recorrer al conjunto de archivos seleccionados utilizando para ello un bucle for y al inicio de cada iteración, defino a las siguientes variables:
  • $error: El código de error generado al seleccionar y subir temporalmente el archivo. La lista de códigos y su significado la puedes ver en el enlace que adjunto.
  • $size: El tamaño del archivo actual en la iteración, al cual divido entre 1048576 para obtener el equivalente en Megabytes.
  • $tmp_name: El nombre temporal del archivo actual en la iteración.
  • $name: El nombre del archivo actual en la iteración.
  • $type: El tipo real del archivo, esto es para evitar que el usuario intente subir un archivo disfrazado el cual podría ser de contenido malicioso. La función getimagesize me permite obtener dicho dato, pero también existen otras funciones.

Definido esto, verificamos que no haya ocurrido algún error al momento de subir temporalmente el actual archivo, que su tamaño sea menor o igual al máximo permitido por archivo y que el tipo del archivo actual se encuentre en el array con los tipos de archivo que definimos al inicio. De cumplirse todo esto, procedemos a subir el archivo, caso contrario, mostramos un mensaje indicándole al usuario que no se pudo subir el archivo por las razones que puedes ver en esa línea de código. Pero si todo se encuentra en orden, procedemos a subir el archivo; de realizarse la misma, mostramos un mensaje indicándole al usuario que el archivo actual en la iteración del bucle ha sido subido al servidor, caso contrario, mostramos un mensaje indicándole al usuario que no se pudo subir el archivo en cuestión.

Y eso es todo. Te sugiero que analices el código línea a línea por si te quedan duda o deseas realizar mejoras.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 22/08/2014 a las 10:56 Razón: Corrección en la indentación
  #3 (permalink)  
Antiguo 23/08/2014, 19:59
 
Fecha de Ingreso: noviembre-2010
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Respuesta: Imagen repetida al subir a servidor, upload fotos

Cita:
Iniciado por Alexis88 Ver Mensaje
Noto inconsistencia en tu código, por ejemplo, el subíndice 'tmp_name' no es un array como para que lo intentes recorrer con un bucle, además, iteras cinco veces en el bucle cuando quizá no siempre se vayan a seleccionar cinco archivos.

Yo lo haría así:

Código HTML:
Ver original
  1. <form action = "upload.php" method = "post" enctype = "multipart/form-data">
  2.     Selecciona las imágenes: <input type = "file" name = "myFiles[]" multiple accept = "image/jpeg, image/png, image/gif" />
  3.     <input type = "submit" />
  4. </form>

Código PHP:
Ver original
  1. $files = $_FILES['myFiles'];
  2. $total = count($files['name']);
  3. $max_file_uploads = ini_get('max_file_uploads');
  4. $post_max_size = (int)ini_get('post_max_size');
  5. $upload_max_filesize = (int)ini_get('upload_max_filesize');
  6. $totalUploaded = 0;
  7. $types = array('image/jpeg', 'image/png', 'image/gif');
  8.  
  9. if ($total){
  10.     foreach ($files['size'] as $size) $totalUploaded += $size;
  11.     $totalUploaded /= 1048576;
  12.  
  13.     if ($total <= $max_file_uploads && $totalUploaded <= $post_max_size){
  14.         for ($i = 0; $i < $total; $i++){
  15.             $error = $files['error'][$i];
  16.             $size = $files['size'][$i] / 1048576;
  17.             $tmp_name = $files['tmp_name'][$i];
  18.             $name = $files['name'][$i];
  19.             $type = getimagesize($tmp_name)['mime'];
  20.  
  21.             if ($error == UPLOAD_ERR_OK && $size <= $upload_max_filesize && in_array($type, $types)){
  22.                 if (move_uploaded_file($tmp_name, 'img/' . $name)){
  23.                     echo 'El archivo ' . $name . ' ha sido subido<br />';
  24.                 }
  25.                 else{
  26.                     echo 'No se pudo subir el archivo ' . $name . '<br />';
  27.                 }
  28.             }
  29.             else{
  30.                 echo 'No se pudo subir el archivo ' . $name . ', su tamaño excede el límite o no es un archivo de imagen<br />';
  31.             }
  32.         }
  33.     }
  34.     else{
  35.         echo 'La cantidad de archivos seleccionados supera al máximo permitido o el tamaño combinado de los archivos seleccionados supera al tamaño máximo permitido';
  36.     }
  37. }
  38. else{
  39.     echo 'No has seleccionado archivos';
  40. }

Lo que hago es lo siguiente. Primero, en el formulario, tengo un <input> de tipo file, con nombre myFiles[] con corchetes para tratarlo como un array y en el archivo PHP, tomar los archivos seleccionados utilizando una estructura repetitiva y además, los atributos multiple para poder tomar a más de un archivo y accept con el que defino los tipos de archivo que el usuario podrá seleccionar, aunque puede cambiarse esto manualmente. Luego, en el archivo PHP, defino a las siguientes variables:
  • $files: Le asigno el array de archivos.
  • $total: El total de archivos subidos.
  • $max_file_uploads: La cantidad máxima de archivos que se permite subir al servidor.
  • $post_max_size: El tamaño combinado máximo de bytes que se permite subir al servidor.
  • $upload_max_filesize: El tamaño máximo de bytes por archivo que se permite subir al servidor.
  • $totalUploaded: Variable que originalmente tiene como valor 0 y que más adelante albergará la cantidad total de bytes sumados de todos los archivos seleccionados.
  • $types: Un array con los tipos de archivo permitidos.

Definido esto, verifico si se han seleccionado archivos, de ser así, procedo con las operaciones, caso contrario, muestro un mensaje indicándole al usuario que no ha seleccionado archivos. De darse el primer caso (que es el que obviamente esperamos), recorro la lista de valores con los tamaños de los archivos seleccionados y los voy acumulando en la variable $totalUploaded, cuyo valor final divido entre 1048576 (cantidad de bytes en un Megabyte) para obtener el equivalente en Megabytes. Luego, verifico que la cantidad de archivos seleccionados sea menor o igual al máximo permitido y que la cantidad total de Megabytes subidos entre todos los archivos seleccionados sea menor o igual a lo que permite el servidor, de cumplirse esto, procedo a recorrer al conjunto de archivos seleccionados utilizando para ello un bucle for y al inicio de cada iteración, defino a las siguientes variables:
  • $error: El código de error generado al seleccionar y subir temporalmente el archivo. La lista de códigos y su significado la puedes ver en el enlace que adjunto.
  • $size: El tamaño del archivo actual en la iteración, al cual divido entre 1048576 para obtener el equivalente en Megabytes.
  • $tmp_name: El nombre temporal del archivo actual en la iteración.
  • $name: El nombre del archivo actual en la iteración.
  • $type: El tipo real del archivo, esto es para evitar que el usuario intente subir un archivo disfrazado el cual podría ser de contenido malicioso. La función getimagesize me permite obtener dicho dato, pero también existen otras funciones.

Definido esto, verificamos que no haya ocurrido algún error al momento de subir temporalmente el actual archivo, que su tamaño sea menor o igual al máximo permitido por archivo y que el tipo del archivo actual se encuentre en el array con los tipos de archivo que definimos al inicio. De cumplirse todo esto, procedemos a subir el archivo, caso contrario, mostramos un mensaje indicándole al usuario que no se pudo subir el archivo por las razones que puedes ver en esa línea de código. Pero si todo se encuentra en orden, procedemos a subir el archivo; de realizarse la misma, mostramos un mensaje indicándole al usuario que el archivo actual en la iteración del bucle ha sido subido al servidor, caso contrario, mostramos un mensaje indicándole al usuario que no se pudo subir el archivo en cuestión.

Y eso es todo. Te sugiero que analices el código línea a línea por si te quedan duda o deseas realizar mejoras.

Saludos
primero que nada agradecer tu tiempo estimado @Alexis88, y disculpa por no haber respondido antes, estube sin conexion, respecto al codigo tal como me comentas, varios problemas, me di cuenta por ejemplo que ahora me hacia el insert, pero me repetia las imagenes, lo otro que me dicuenta es que si cargaba el maximo de imagenes permitidas (5) me guardaba 3 0 4 bien y 1 o 2 con errores (sin exptension)....el codigo que me compartiste se ve super completo, lo tratare de implementar y te estoy comentando...gracias por la ayuda amigo un abrazo....
  #4 (permalink)  
Antiguo 23/08/2014, 21:52
 
Fecha de Ingreso: noviembre-2010
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Respuesta: Imagen repetida al subir a servidor, upload fotos

amigo una consulta mas, con el codigo que expuse primeramente, obtenia la ruta completa de las imagenes, y la sinserto en mi bd, esta es la funcion que me hace el insert
Código PHP:
Ver original
  1. try{
  2.                
  3.                //$titulo_aviso=filter_input(INPUT_POST,$titulo_aviso,FILTER_SANITIZE_MAGIC_QUOTES);
  4.                
  5.                 $query  ="INSERT INTO avisos (titulo_aviso,categoria_aviso,tipo_aviso,comuna,aviso_completo,valor_producto,fecha_publicacion,nombre,telefono_celular,telefono_fijo,correo_electronico,direccion,img1,img2,img3,img4,img5,valido)"; //,img1,img2,img3,img4,img5
  6.                 $query .="VALUES(:titulo_aviso,:categoria_aviso,:tipo_aviso,:comuna,:aviso_completo,:valor_producto,:fecha_publicacion,:nombre,:telefono_celular,:telefono_fijo,:correo_electronico,:direccion,:img1,:img2,:img3,:img4,:img5,1)"; //,:rutas[0],:rutas[1],:rutas[2],:rutas[3],:rutas[4]
  7.                 //Preparamos la consulta
  8.                 $stmt= $this->con->prepare($query);
  9.                 $stmt->bindParam(':titulo_aviso',$_POST['titulo_aviso'],PDO::PARAM_STR);
  10.                 $stmt->bindParam(':categoria_aviso', $_POST['categoria_aviso'] ,PDO::PARAM_STR);
  11.                 $stmt->bindParam(':tipo_aviso', $_POST['tipo_aviso'] ,PDO::PARAM_STR);
  12.                 $stmt->bindParam(':comuna', $_POST['comuna'],PDO::PARAM_STR);
  13.                 $stmt->bindParam(':aviso_completo', $_POST['aviso_completo'],PDO::PARAM_STR);
  14.                 $stmt->bindParam(':valor_producto', $_POST['valor_producto']);
  15.                 //Fecha de Publicacion
  16.                 $stmt->bindParam(':fecha_publicacion',date('Y-m-d', time()),PDO::PARAM_STR);
  17.                 $stmt->bindParam(':nombre', $_POST['nombre'] ,PDO::PARAM_STR);
  18.                 $stmt->bindParam(':telefono_celular', $_POST['telefono_celular']);
  19.                 $stmt->bindParam(':telefono_fijo', $_POST['telefono_fijo']);
  20.                 $stmt->bindParam(':correo_electronico', $_POST['correo_electronico'] ,PDO::PARAM_STR);
  21.                 $stmt->bindParam(':direccion', $_POST['direccion'] ,PDO::PARAM_STR);
  22.                 $stmt->bindParam(':img1', $rutas[0]); //, $this->rutas[0]
  23.                 $stmt->bindParam(':img2' ,$rutas[1]);
  24.                 $stmt->bindParam(':img3' ,$rutas[2]);
  25.                 $stmt->bindParam(':img4' ,$rutas[3]);
  26.                 $stmt->bindParam(':img5' ,$rutas[4]);
  27.                
  28.  
  29.                 //Ejecutamos la Consulta
  30.                 $stmt->execute();
  31.                
  32.                 //Mensaje de Exito si el aviso se publico sin Problemas en la Base de Datos
  33.                 echo "Gracias por Utilizar nuestra Plataforma, su aviso sera Publicado previa Aprobación de los Administradores <br>";
  34.                 echo "<a href='../avisos.php'>Ver Avisos Publicados</a>";
  35.                
  36.                 /*echo "<div class='alert alert-success alert-dismissable'>";
  37.                 echo "<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;</button>";
  38.                 echo "Su aviso ha Sido Publicado con Exito...Gracias por Utilizar nuestra Plataforma";
  39.                 echo "</div>";*/
  40.  
  41.                 }catch(PDOException $e){
  42.                
  43.                 echo $e->errorInfo;
  44.                
  45.                 //Mensaje de Error si el aviso no se publico en la Base de Datos
  46.                 echo "Su aviso no se ha podido Publicar...Por favor Intente mas Tarde";
  47.                
  48.                
  49.                 /*echo "<div class=\"alert alert-danger alert-dismissable\">";
  50.                 echo "<button type=\"button\" class=\"close\" data-dismiss=\"danger\" aria-hidden=\"true\">&times;</button>";
  51.                 echo "Su aviso no se ha podido Publicar...Por favor Intente mas Tarde";
  52.                 echo "</div>";*/
  53.                 }//catch
  54.  
  55.         }//funcion InsertarAvisos

como la integro con la funcion que me facilitaste, no encuentro como almacenar las rutas con la funcion nueva...saludos
  #5 (permalink)  
Antiguo 23/08/2014, 22:18
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Imagen repetida al subir a servidor, upload fotos

Si te fijas en la línea 22 del código PHP del ejemplo, guardo la imagen en una carpeta de nombre 'img', entonces, al cumplirse la condición, solo te queda guardar en la BD al nombre y ruta de la imagen recién guardada. En otras palabras, la inserción la harías a partir de la línea número 23.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 24/08/2014, 17:31
 
Fecha de Ingreso: noviembre-2010
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Respuesta: Imagen repetida al subir a servidor, upload fotos

gracias estimado, hice cambios por el tema de hacer el insert, pero me encuentro con algunos problemas....para almacenar la ruta de las imagenes que subo, en el codigo anterior usaba algo asi:
Código PHP:
 //Ruta en Servidor
               
$rutaFinal="../imagenes_avisos/".$nombreUnico.$nombres;
               
$rutaFinalSQL="imagenes_avisos/".$nombreUnico.$nombres//VALIDAR QUE ESTA RUTA EXISTA

            //Movemos los Archivos al Servidor
            
move_uploaded_file($nombresTemporal,$rutaFinal);
              
            
// Actualizas la ruta correspondiente para este archivo
            
$rutas[$key] = $rutaFinalSQL
intente adaptarlo con el codigo que me facilitaste llegando a este resultado:

Código PHP:
if(isset($_POST['enviar'])){
            
        
$files $_FILES['fotosavisos'];
        
$total count($files['fotosavisos']);
        
$max_file_uploads ini_get('max_file_uploads');
        
$post_max_size = (int)ini_get('post_max_size');
        
$upload_max_filesize = (int)ini_get('upload_max_filesize');
        
$totalUploaded 0;
        
$types = array('image/jpeg''image/png''image/gif');
        
        if (
$total){
        foreach (
$files['size'] as $size$totalUploaded += $size;
        
$totalUploaded /= 1048576;
        if (
$total <= $max_file_uploads && $totalUploaded <= $post_max_size){
        for (
$i 0$i $total$i++){
            
$error $files['error'][$i];
            
$size $files['size'][$i] / 1048576;
            
$tmp_name $files['tmp_name'][$i];
            
$name $files['name'][$i];
            
$type getimagesize($tmp_name)['mime'];
 
            if (
$error == UPLOAD_ERR_OK && $size <= $upload_max_filesize && in_array($type$types)){
                if (
move_uploaded_file($tmp_name'imagenes_avisos/' $name)){
                   
$rutas[$i]=$rutas;
                   
print_r($files);
                }
                else{
                    echo 
'No se pudo subir el archivo ' $name '<br />';
                    exit;
                }
            }
            else{
                echo 
'No se pudo subir el archivo ' $name ', su tamaño excede el límite o no es un archivo de imagen<br />';
            
                exit;
            }
        }
    }
    else{
        echo 
'La cantidad de archivos seleccionados supera al máximo permitido o el tamaño combinado de los archivos seleccionados supera al tamaño máximo permitido';
    }
 }else{
     try{
          if(!isset(
$rutas)){
             
$rutas=array();
            }  
        
//$obj->insertarAvisos($rutas);
        
print_r($_POST);
        
//exit();
        
}catch(PDOException $e){
            echo 
$e;
        } 
        
}
// if post

pero me da este error: Notice: Undefined index: fotosavisos in C:\xampp\htdocs\avisos\crud\insert.php on line 17, y no mueve la imagen...

la linea en cuestion es esta: $total = count($files['fotosavisos']);

Muchas gracias por tu tiempo y tu ayuda...saludos cordiales
  #7 (permalink)  
Antiguo 24/08/2014, 22:09
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Imagen repetida al subir a servidor, upload fotos

Obviamente no existe el índice 'fotoavisos' porque ya lo tomaste y asignaste todo su contenido a $files. El total de imágenes lo puedes obtener con cualquier de los índices contenidos, ya sea 'name', 'tmp_name', 'type', 'size' o 'error'. Fíjate que yo lo tomo por 'name'.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #8 (permalink)  
Antiguo 25/08/2014, 16:53
 
Fecha de Ingreso: noviembre-2010
Mensajes: 131
Antigüedad: 14 años
Puntos: 1
Respuesta: Imagen repetida al subir a servidor, upload fotos

estimado, siguiendo lo comentado, tengo el codigo asi:
Código PHP:
if(isset($_POST['enviar'])){
           
        
$files $_FILES['fotosavisos'];
        
$total count($files);
        
$max_file_uploads ini_get('max_file_uploads');
        
$post_max_size = (int)ini_get('post_max_size');
        
$upload_max_filesize = (int)ini_get('upload_max_filesize');
        
$totalUploaded 0;
        
$types = array('image/jpeg''image/png''image/gif');
       
        if (
$total){
        foreach (
$files['size'] as $size$totalUploaded += $size;
        
$totalUploaded /= 1048576;
        if (
$total <= $max_file_uploads && $totalUploaded <= $post_max_size){
        for (
$i 0$i $total$i++){
            
$error $files['error'][$i];
            
$size $files['size'][$i] / 1048576;
            
$tmp_name $files['tmp_name'][$i];
            
$name $files['name'][$i];
            
$type getimagesize($tmp_name)['mime'];
 
            if (
$error == UPLOAD_ERR_OK && $size <= $upload_max_filesize && in_array($type$types)){
                if (
move_uploaded_file($tmp_name'../imagenes_avisos/' $name)){
                   
$files[$i]=$rutas;
                   
print_r($files);
                }
                else{
                    echo 
'No se pudo subir el archivo ' $name '<br />';
                    exit;
                }
            }
            else{
                echo 
'No se pudo subir el archivo ' $name ', su tamaño excede el límite o no es un archivo de imagen<br />';
           
                exit;
            }
        }
    }
    else{
        echo 
'La cantidad de archivos seleccionados supera al máximo permitido o el tamaño combinado de los archivos seleccionados supera al tamaño máximo permitido';
    }
 }else{
     try{
          if(!isset(
$rutas)){
             
$rutas=array();
            }  
        
//$obj->insertarAvisos($rutas);
        
print_r($_POST);
        
//exit();
        
}catch(PDOException $e){
            echo 
$e;
        }
       
}
// if post

y al ejecutar, de hecho mueve las imagenes selecionadas, pero me da estos errores (mostrados con un print_r por eso muestra el array):
Código PHP:
NoticeUndefined variablerutas in C:xampphtdocsavisoscrudinsert.php on line 37
Array ( [name] => Array ( [0] => imagesasasasa.jpg [1] => imagesasassdff.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => C:xampptmpphp724E.tmp [1] => C:xampptmpphp724F.tmp ) [error] => Array ( [0] => [1] => ) [size] => Array ( [0] => 7343 [1] => 6899 ) [0] => )
NoticeUndefined variablerutas in C:xampphtdocsavisoscrudinsert.php on line 37
Array ( [name] => Array ( [0] => imagesasasasa.jpg [1] => imagesasassdff.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => C:xampptmpphp724E.tmp [1] => C:xampptmpphp724F.tmp ) [error] => Array ( [0] => [1] => ) [size] => Array ( [0] => 7343 [1] => 6899 ) [0] => [1] => )
NoticeUndefined offset2 in C:xampphtdocsavisoscrudinsert.php on line 29

Notice
Undefined offset2 in C:xampphtdocsavisoscrudinsert.php on line 30

Notice
Undefined offset2 in C:xampphtdocsavisoscrudinsert.php on line 31

Notice
Undefined offset2 in C:xampphtdocsavisoscrudinsert.php on line 32

Warning
getimagesize(): Filename cannot be empty in C:xampphtdocsavisoscrudinsert.php on line 33
No se pudo subir el archivo 
su tamaño excede el lÃ*mite o no es un archivo de imagen 
y me sube la imagen igual, independiente de la validacion, en realidad la validacion no me esta intersando tanto (por ahora) l ouqe mas me urge es que se puedan subir bien las imagenes y guardar las rutas en la bd apra recuperarlas...

lo que me da dudas es aca:

$files[$i]=$rutas; no se si estare bien, mas o menos en base a lo anterior que usaba para guardar las rutas y si me resultaba...

Saludos y gracias por tu tiempo
  #9 (permalink)  
Antiguo 25/08/2014, 23:26
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Imagen repetida al subir a servidor, upload fotos

Noto varios errores en tu código. Para empezar, como te dije en la respuesta anterior, el total de imágenes subidas lo obtienes contando la cantidad de elementos de alguno de los cinco índices de $files, los cuales son 'name', 'tmp_name', 'type', 'size' y 'error'. De este modo:

Código PHP:
Ver original
  1. $total = count($files);

Obtienes el total de elementos de $files que siempre serán cinco por lo dicho en el anterior párrafo. Por otro lado, lo siguiente:

Código PHP:
Ver original
  1. $files[$i] = $rutas;

No tiene sentido. Para empezar, antes de esa línea, no veo en dónde asignes un valor a $rutas, además, estás añadiendo elementos al array asociativo $files que solamente debe de contener a las cinco propiedades antes mencionadas. Si deseas almacenar en un array la ruta de cada imagen subida, crea uno nuevo.

Ten cuidado con los exit que colocas en los casos en los que no se puede subir la imagen, pues cortarían la ejecución del script y, por ende, no se podrían subir las demás imágenes.

Lo ideal es que guardes la ruta y el nombre de cada imagen en la BD ya sea por cada vez que se guarde la imagen en el servidor o bien guardar las rutas y nombres y al final del bucle, guardarlas.

Código PHP:
Ver original
  1. if ($total <= $max_file_uploads && $totalUploaded <= $post_max_size){
  2.     $rutas = array(); //Array en donde almacenaré las rutas y nombres de las imágenes
  3.     for ($i = 0; $i < $total; $i++){
  4.         $error = $files['error'][$i];
  5.         $size = $files['size'][$i] / 1048576;
  6.         $tmp_name = $files['tmp_name'][$i];
  7.         $name = $files['name'][$i];
  8.         $type = getimagesize($tmp_name)['mime'];
  9.  
  10.         if ($error == UPLOAD_ERR_OK && $size <= $upload_max_filesize && in_array($type, $types)){
  11.             if (move_uploaded_file($tmp_name, 'img/' . $name)){
  12.                 echo 'El archivo ' . $name . ' ha sido subido<br />';
  13.                 $guardar[] = 'img/' . $name;
  14.             }
  15.             else{
  16.                 echo 'No se pudo subir el archivo ' . $name . '<br />';
  17.             }
  18.         }
  19.         else{
  20.             echo 'No se pudo subir el archivo ' . $name . ', su tamaño excede el límite o no es un archivo de imagen<br />';
  21.         }
  22.     }
  23.  
  24.     $valores = "('" . implode("'), ('", $rutas) . "')";
  25.     mysqli_query($conexion, "INSERT INTO tabla (imagen) VALUES {$valores}");
  26. }

Como puedes ver, creo un array justo antes de iniciar el bucle y por cada archivo subido al servidor, guardo su ruta y nombre. Al finalizar el bucle, le doy forma a la cadena a insertar con las rutas y nombres de las imágenes que se subieron al servidor, tomando una forma similar a esta:

Código MySQL:
Ver original
  1. INSERTO INTO tabla (imagen) VALUES ('img/imagen1.jpg'), ('img/imagen2.jpg'), ('img/imagen3.jpg')

Veo que trabajas con PDO, de modo que solo te quedaría adaptar la forma que presento de guardar datos en la BD con MySQLi a la manera en la que trabajas. Sería bueno que en lugar de colocar el nombre de las imágenes como llegaron por defecto, crearas cadenas aleatorias para cada una de ellas pues puede darse el caso de que se suban imágenes con los mismos nombres (en tiempos distintos) y podría ocurrir un reemplazo. Por cierto, el bloque de código en el que usas la estructura Try - Catch, está de más. Mejor deja el mensaje que había puesto inicialmente y, por favor, fíjate bien en cómo es que realizo el proceso para que no cometas más errores básicos.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: fotos, repetida, servidor, sql, upload
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:31.