Foros del Web » Programando para Internet » PHP »

subida múltiple de ficheros

Estas en el tema de subida múltiple de ficheros en el foro de PHP en Foros del Web. Buenos días. Estoy intentando subir varios archivos a la vez en una carpeta que previamente creo en el mismo php de subida. Mi html es: ...
  #1 (permalink)  
Antiguo 10/06/2014, 05:23
 
Fecha de Ingreso: junio-2014
Mensajes: 101
Antigüedad: 9 años, 10 meses
Puntos: 0
subida múltiple de ficheros

Buenos días. Estoy intentando subir varios archivos a la vez en una carpeta que previamente creo en el mismo php de subida. Mi html es:

Código HTML:
Ver original
  1. <form action = 'insertar_contenido1.php' method = 'post' enctype = 'multipart/form-data'>
  2.         <table cellspacing="2" cellpadding="2" border="1">
  3.             <input type = "file" name = 'cliente' multiple/><br/>
  4.             <input type = "submit" name = "enviar" value = "Subir contenido"/><br/>
  5.         </table>

y mi php:

Código PHP:
Ver original
  1. $formatos = array('.ppt', '.pdf', '.gif', '.mpg', '.jpg', '.png', '.doc', '.xlsx');
  2. $nombreDirectorio = "C:/raspberries/".$fila["Dispositivos"]."/contenido". $sigcarpeta . "/";
  3. $nombreFichero = $_FILES['cliente']['name'];
  4. $nombreCompleto = $nombreDirectorio . $nombreFichero;
  5. $ext = substr($nombreFichero, strrpos($nombreFichero, '.'));
  6.  
  7. if(in_array($ext, $formatos)){
  8.     foreach (($_FILES['cliente']['error']) as $key => $error) {
  9.         if ($error == UPLOAD_ERR_OK) {
  10.             $tmp_name = $_FILES['cliente']['tmp_name'][$key];
  11.             $name = $_FILES['cliente']['name'][$key];
  12.             copy($_FILES['cliente']['tmp_name'], $nombreCompleto);
  13.         }else {
  14.             echo "No se ha podido subir el fichero.<br>";
  15.             echo '<a href = "seleccionar.html">Insertar nuevo contenido.<br></a>';
  16.         }  
  17.     }
  18. }else{
  19.     echo "Archivo con extensión no permitida.<br>";
  20.     echo '<a href = "seleccionar.html">Insertar nuevo contenido.<br></a>';
  21. }

No se qué es lo que estoy haciendo mal pero no me sube los archivos porque me aparece este aviso:

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\Trabajo\insertar_contenido1.php on line 70

Alguien puede ayudarme? Mil gracias!

Última edición por Triby; 11/06/2014 a las 00:40 Razón: Código en highlight
  #2 (permalink)  
Antiguo 10/06/2014, 07:43
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: subida múltiple de ficheros

La razón es por que la variable global $_FILES['cliente']['error'] no es un arreglo como esperas.
Para solucionarlo cambiar esto:
Código HTML:
Ver original
  1. <input type = "file" name = 'cliente' multiple/><br/>
por esto:
Código HTML:
Ver original
  1. <input type = "file" name = 'cliente[]' multiple/><br/>
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 11/06/2014, 00:35
 
Fecha de Ingreso: junio-2014
Mensajes: 101
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: subida múltiple de ficheros

Poner los corchetes es algo que había probado, pero al tener en mi código una línea que devuelve la extensión;

$ext = substr($nombreFichero, strrpos($nombreFichero, '.'));

me dice que es un archivo con extensión no permitida porque para ello se necesita un string y no un array..existe algo equivalente para arrays?

Muchas gracias por la colaboración.
  #4 (permalink)  
Antiguo 11/06/2014, 00:44
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: subida múltiple de ficheros

El problema está en que quieres examinar nombre y extensión de archivo por medio de un array, fuera del foreach:

Código PHP:
Ver original
  1. $nombreFichero = $_FILES['cliente']['name']; // Esto devuelve un array porque no especificas índice
  2. $nombreCompleto = $nombreDirectorio . $nombreFichero;
  3. $ext = substr($nombreFichero, strrpos($nombreFichero, '.'));

Esas asignaciones y la comparación posterior debes hacerlas dentro del foreach, para cada archivo subido.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 11/06/2014, 01:09
 
Fecha de Ingreso: junio-2014
Mensajes: 101
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: subida múltiple de ficheros

Si lo he entendido bien, Triby, tengo que meter estas tres líneas de código dentro del foreach. Entonces mi código quedaría de la siguiente forma:

Código PHP:
Ver original
  1. $formatos = array('.ppt', '.pdf', '.gif', '.mpg', '.jpg', '.png', '.doc', '.xlsx');
  2. if(in_array($ext, $formatos)){
  3.     foreach (($_FILES['cliente']['error']) as $key => $error) {
  4.         if ($error == UPLOAD_ERR_OK) {  
  5.             $nombreFichero = $_FILES['cliente'][0]['name'];
  6.             $nombreCompleto = $nombreDirectorio . $nombreFichero;
  7.             $ext = substr($nombreFichero, strrpos($nombreFichero, '.'));
  8.             $tmp_name = $_FILES['cliente']['tmp_name'][$key];  
  9.             $name = $_FILES['cliente']['name'][$key];
  10.             copy($_FILES['cliente']['tmp_name'], $nombreCompleto);
  11.         }else {
  12.             echo "No se ha podido subir el fichero.<br>";
  13.             echo '<a href = "seleccionar.html">Insertar nuevo contenido.<br></a>';
  14.         }  
  15.     }
  16. }else{
  17.     echo "Archivo con extensión no permitida.<br>";
  18.     echo '<a href = "seleccionar.html">Insertar nuevo contenido.<br></a>';
  19. }

En cuanto selecciono varios ficheros, me dice que le xtensión no es permitida, asiq no me los sube.

Si elimino la parte del formato me dice:

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\Trabajo\insertar_contenido1.php on line 70.

y no me sube nada...la verdad es que ya no se qué más puedo variar...estoy un poco desesperada! =(

Última edición por Triby; 11/06/2014 a las 16:05 Razón: Código en highlight
  #6 (permalink)  
Antiguo 11/06/2014, 16:13
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: subida múltiple de ficheros

Bueno, es que no necesitas recorrer el array de extensiones válidas y, de hecho, yo les quitaría el punto:

Código PHP:
Ver original
  1. $formatos = array('ppt', 'pdf', 'gif', 'mpg', 'jpg', 'png', 'doc', 'xlsx');
  2.         foreach (($_FILES['cliente']['error']) as $key => $error) {
  3.             if ($error == UPLOAD_ERR_OK) {  
  4.                 // Obtienes el nombre de acuerdo al índice $key
  5.                 $nombreFichero = $_FILES['cliente']['name'][$key];
  6.                 $nombreCompleto = $nombreDirectorio . $nombreFichero;
  7.  
  8.                 // Obtienes la extensión sin el punto
  9.                 $ext = end(explode('.', $nombreFichero);
  10.                 // Ahora sí verificas que la extensión sea válida
  11.                 if(in_array($ext, $formatos)) {
  12.                      $tmp_name = $_FILES['cliente']['tmp_name'][$key];  
  13.                      $name = $_FILES['cliente']['name'][$key];
  14.                     // Usa move_uploaded_file en lugar de copy
  15.                     if(move_uploaded_file($_FILES['cliente']['tmp_name'][$key], $nombreCompleto)) {
  16.                          echo 'Archivo subido con éxito!<br />';
  17.                      } else {
  18.                          echo 'Error moviendo archivo a su destino final<br />';
  19.                      }
  20.                 } else {
  21.                      echo 'Archivo con extensión no permitida<br />';
  22.                 }
  23.             } else if($error == 4) {
  24.                 echo 'No seleccionaste un archivo para subir<br />';
  25.             }else {
  26.                 echo "No se ha podido subir el fichero.<br>";
  27.                 echo '<a href = "seleccionar.html">Insertar nuevo contenido.<br></a>';
  28.             }  
  29.         }
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 12/06/2014, 02:05
 
Fecha de Ingreso: junio-2014
Mensajes: 101
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: subida múltiple de ficheros

buenos días Triby. Necesito utilizar la función copy porque voy a subir videos a mysql, y con move_uploaded_file me aparecía una limitación de megas cuando lo intenté usar.
Siguiendo tu código, y cambiando tan solo el copy, me sigue saliendo el mismo warning:

Invalid argument supplied for foreach() in C:\xampp\htdocs\Trabajo\insertar_contenido1.php on line 70.

Aunque solo es un warning, no me sube el contenido que sí sube sin foreach. Alguna idea más? muchisimas gracias de nuevo

Código PHP:
Ver original
  1. $formatos = array('ppt', 'pdf', 'gif', 'mpg', 'jpg', 'png', 'doc', 'xlsx');
  2. foreach (($_FILES['cliente']['error']) as $key => $error) {
  3.     if ($error == UPLOAD_ERR_OK) {  
  4.         // Obtienes el nombre de acuerdo al índice $key
  5.         $nombreFichero = $_FILES['cliente']['name'][$key];
  6.         $nombreCompleto = $nombreDirectorio . $nombreFichero;
  7.         // Obtienes la extensión sin el punto
  8.         $ext = end(explode('.', $nombreFichero));
  9.         //$ext = substr($nombreFichero, strrpos($nombreFichero, '.'));
  10.         // Ahora sí verificas que la extensión sea válida
  11.         if(in_array($ext, $formatos)) {
  12.             $tmp_name = $_FILES['cliente']['tmp_name'][$key];  
  13.             $name = $_FILES['cliente']['name'][$key];
  14.             if(copy($_FILES['cliente']['tmp_name'][$key], $nombreCompleto)) {
  15.                 echo 'Archivo subido con éxito!<br />';
  16.             } else {
  17.                 echo 'Error moviendo archivo a su destino final<br />';
  18.             }
  19.         } else {
  20.             echo 'Archivo con extensión no permitida<br />';
  21.         }
  22.     } else if($error == 4) {
  23.         echo 'No seleccionaste un archivo para subir<br />';
  24.     }else {
  25.         echo "No se ha podido subir el fichero.<br>";
  26.         echo '<a href = "seleccionar.html">Insertar nuevo contenido.<br></a>';
  27.     }  
  28. }
  #8 (permalink)  
Antiguo 12/06/2014, 04:34
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: subida múltiple de ficheros

Bueno, parece que no seguiste la sugerencia de hhs acerca de los corchetes:

Código HTML:
Ver original
  1. <input type="file" name="cliente[]" multiple/><br/>
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 12/06/2014, 04:58
 
Fecha de Ingreso: junio-2014
Mensajes: 101
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: subida múltiple de ficheros

sí he seguido la sugerencia...y me dice que el archivo tiene una extensión no permitida =(

asiq lo he finalmente he hecho ha sido eliminar la validación de la extensión. Me deja subir cualquier archivo y varios a la vez. Parece que está solucionado.

Mil gracias de nuevo!!!
  #10 (permalink)  
Antiguo 12/06/2014, 05:22
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: subida múltiple de ficheros

Lo de la extensión es fácil de arreglar, porque creo que el archivo que estabas tratando de subir podría no tener la extensión en minúsculas, sólo necesitas cambiar la forma de obtener la extensión del archivo:

Código PHP:
Ver original
  1. $ext = strtolower(end(explode('.', $nombreFichero)));
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: ficheros, html, múltiple, subida
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 17:41.