Foros del Web » Programando para Internet » PHP »

Problemas al subir varias imágenes

Estas en el tema de Problemas al subir varias imágenes en el foro de PHP en Foros del Web. Hola a tod@s. Tengo 2 archivos que permiten subir un número indefinido de imágenes. El primero, que en principio funciona correctamente, tiene este código: Código: ...
  #1 (permalink)  
Antiguo 21/05/2012, 05:38
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 1 mes
Puntos: 1
Problemas al subir varias imágenes

Hola a tod@s. Tengo 2 archivos que permiten subir un número indefinido de imágenes. El primero, que en principio funciona correctamente, tiene este código:

Código:
<form name="formu" id="formu" action="subida_fotos.php?id=<?php echo $id?>&id_album=<?php echo $id_album?>&nivel=<?php echo $nivel?>" method="post" enctype="multipart/form-data">
	     <dl>            
	   <dt><label>Archivos a Subir:</label></dt>
	        <!-- Esta div contendrá todos los campos file que creemos -->
	   <dd><div id="adjuntos">
	        <!-- Hay que prestar atención a esto, el nombre de este campo debe siempre terminar en []
	        como un vector, y ademas debe coincidir con el nombre que se da a los campos nuevos 
	        en el script -->
	   <input type="file" name="archivos[]" /><br />
	   </div></dd>
	   <dt><a href="#" onclick="addCampo()">Subir otro archivo</a></dt>      
	   <dd><input type="submit" value="Enviar" id="envia" name="envia" /></dd>
	     </dl>
		</form>

		<!-- JAVASCRIPT -->
		<script type="text/javascript">
		var numero = 0; //Esta es una variable de control para mantener nombres
		            //diferentes de cada campo creado dinamicamente.
		evento = function (evt) { //esta funcion nos devuelve el tipo de evento disparado
		   return (!evt) ? event : evt;
		}
		
		//Aqui se hace lamagia... jejeje, esta funcion crea dinamicamente los nuevos campos file
		addCampo = function () { 
		//Creamos un nuevo div para que contenga el nuevo campo
		   nDiv = document.createElement('div');
		//con esto se establece la clase de la div
		   nDiv.className = 'archivo';
		//este es el id de la div, aqui la utilidad de la variable numero
		//nos permite darle un id unico
		   nDiv.id = 'file' + (++numero);
		//creamos el input para el formulario:
		   nCampo = document.createElement('input');
		//le damos un nombre, es importante que lo nombren como vector, pues todos los campos
		//compartiran el nombre en un arreglo, asi es mas facil procesar posteriormente con php
		   nCampo.name = 'archivos[]';
		//Establecemos el tipo de campo
		   nCampo.type = 'file';
		//Ahora creamos un link para poder eliminar un campo que ya no deseemos
		   a = document.createElement('a');
		//El link debe tener el mismo nombre de la div padre, para efectos de localizarla y eliminarla
		   a.name = nDiv.id;
		//Este link no debe ir a ningun lado
		   a.href = '#';
		//Establecemos que dispare esta funcion en click
		   a.onclick = elimCamp;
		//Con esto ponemos el texto del link
		   a.innerHTML = 'Eliminar';
		//Bien es el momento de integrar lo que hemos creado al documento,
		//primero usamos la función appendChild para adicionar el campo file nuevo
		   nDiv.appendChild(nCampo);
		//Adicionamos el Link
		   nDiv.appendChild(a);
		//Ahora si recuerdan, en el html hay una div cuyo id es 'adjuntos', bien
		//con esta función obtenemos una referencia a ella para usar de nuevo appendChild
		//y adicionar la div que hemos creado, la cual contiene el campo file con su link de eliminación:
		   container = document.getElementById('adjuntos');
		   container.appendChild(nDiv);
		}
		//con esta función eliminamos el campo cuyo link de eliminación sea presionado
		elimCamp = function (evt){
		   evt = evento(evt);
		   nCampo = rObj(evt);
		   div = document.getElementById(nCampo.name);
		   div.parentNode.removeChild(div);
		}
		//con esta función recuperamos una instancia del objeto que disparo el evento
		rObj = function (evt) { 
		   return evt.srcElement ?  evt.srcElement : evt.target;
		}
		</script>
En el segundo llamado subida_fotos.php hago una serie de comprobaciones.

Todo funciona correctamente si todas las imágenes subidas cumplen todos los requisitos (de tamaño, de tipo de archivo...). En ese caso muestra cada una de las imágenes y el texto de "imagen subida correctamente".

Cuando hay una sola que no cumple los requisitos muestra correctamente las subidas, y el texto de error en la que falló (por ejemplo <<Error: el archivo sólo puede ser de tipo gif, jpg o png>>).

Sin embargo, cuando hay más de una imagen subida que no cumpla los requisitos, se bloquea, queda en blanco la web y no hace nada. ¿Por qué puede ser? Es que estoy tan cerca de conseguirlo...

Os pongo aquí el código de ese segundo archivo:

Código:
 //Preguntamos si nuetro arreglo 'archivos' fue definido
  if (isset ($_FILES["archivos"])) {
         //de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
         //obtenemos la cantidad de elementos que tiene el arreglo archivos
         $tot = count($_FILES["archivos"]["name"]);
         //este for recorre el arreglo
         for ($i = 0; $i < $tot; $i++){

         	if (is_uploaded_file($_FILES['archivos']['tmp_name'][$i])){
				$nombre_archivo = $_FILES['archivos']['name'][$i];
				$tipo_archivo = $_FILES['archivos']['type'][$i];
				$tamano_archivo = $_FILES['archivos']['size'][$i];
				$error_subida = $_FILES['archivos']['error'][$i];
				$nombre_temporal = $_FILES['archivos']['tmp_name'][$i];
				$directorio = '../../../imagenes/galeria/';			
				$fecha = date("d-m-y-G-i");
							
				if (!empty ($nombre_archivo)){
					if ($error_subida==0){
						if (strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg") || strpos($tipo_archivo, "png")){
							if ($tamano_archivo < 1024000){
									//Verifico que pueda mover el archivo y cambiarle el nombre.
									//El archivo se guradará donde está esta página
								if (move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $directorio.$fecha.$nombre_archivo)){
									//Instrucción:
									$instruccion_maxima = sprintf("Select * FROM `galeria_table`
																	WHERE seccion_id_seccion = %d
																	AND id_album = %d
																	AND id_imagen = (Select max(id_imagen)
																					FROM `galeria_table`
																					WHERE seccion_id_seccion=%d
																					AND id_album=%d)",
																GetSQLValueString($id, "int"),
																GetSQLValueString($id_album, "int"),
																GetSQLValueString($id, "int"),
																GetSQLValueString($id_album, "int"));
										
											// Consulta:
											$consulta_maxima = mysql_query($instruccion_maxima, $conexion)
													or die(mysql_error());
																
											//Recuperamos una fila de resultado como una matriz asociativa
											//(eso es lo que hace mysql_fetch_assoc)
											$fila_maxima = mysql_fetch_assoc($consulta_maxima);
															
											$max = 	$fila_maxima['id_imagen'];
		
											$n = $max+1;
											
											$instruccion = sprintf("INSERT INTO `galeria_table` (seccion_id_seccion,
																id_album, id_imagen, nombre_imagen_espanol)
																VALUES (%d, %d, %d, %s)",
																GetSQLValueString($id, "int"),
																GetSQLValueString($id_album, "int"),
																GetSQLValueString($n, "int"),
																GetSQLValueString($fecha.$nombre_archivo, "text"));						
													
											// Consulta:
											$consulta = mysql_query ($instruccion, $conexion)
												or die(mysql_error());
									
											?>
											<table>
												<tr>
													<td width="12%" align="center" valign="middle">
							        					<img src="../../../imagenes/galeria/<?php echo $fecha.$nombre_archivo?>" align="middle" />
							            				<br /> <br /> <br />
														La imagen <?php echo $fecha.$nombre_archivo;?> fue subida correctamente
														</td>
													</tr>
											</table>
										<?php
										}					
								else {
									echo "<p align=center>Ocurrió algún error al subir el fichero. No pudo guardarse.</p>";
								}
							}
							else{
								echo "<p align=center>Error: el archivo no puede pesar más de 1 MB</p>";
							}
						}
						else{
							echo "<p align=center>Error: el archivo sólo puede ser de tipo gif, jpg o png.</p>";
						}
					}
					else{
						echo "<p align=center> Error en la subida </p>";
						}
				}
				else{
					echo "<p align=center> Error: el archivo no tiene nombre </p>";
					}
         	}
         	else{
				echo "<p align=center> El archivo no subió correctamente </p>";
			}	

         }
		    
	}
¡Muchas gracias por adelantado!
  #2 (permalink)  
Antiguo 21/05/2012, 07:07
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: Problemas al subir varias imágenes

Tienes un follón con los if....
Puedes planteartelo así, simplificar código y seguramente aliminarás o encontarrás tu error:
Código PHP:
$error="";
if (empty (
$nombre_archivo)){$error.="falta nombre<br>";}
if (empty (
$error_subida==0)){$error.="error subida<br>";}
if (
strpos($tipo_archivo"gif" bla bla){$error.="tipo inciorrecto<br>";}
if (
$tamano_archivo 1024000){$error.="demasiado grande<br>";}

if(
$error<>""){
   echo 
$error;
   continue;
}

if (
move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $directorio.$fecha.$nombre_archivo)){
    
bla bla 

Saludos.
  #3 (permalink)  
Antiguo 21/05/2012, 11:33
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Problemas al subir varias imágenes

Gracias por la simplificación. Así mucho más simple, sí.

Sin embargo, sigo teniendo el mismo fallo, aunque lo acoté un poco más.

Si se suben 2 archivos que dan el mismo error (por ejemplo de tipo inadecuado de archivo) sí que salen ambos mensajes de error. El problema está cuando un archivo da un error (por ejemplo formato de archivo inadecuado) y otro da otro (por ejemplo tamaño excesivo). En ese caso no saca por pantalla ninguno de los dos errores, y tampoco sube las imágenes que sí cumplen con todos los requisitos.

¿Por qué puede ser? Gracias.
  #4 (permalink)  
Antiguo 21/05/2012, 11:46
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: Problemas al subir varias imágenes

Podrias poner el código tal y como te ha quedado?
  #5 (permalink)  
Antiguo 22/05/2012, 08:35
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Problemas al subir varias imágenes

Como no, si el favor me lo hacéis a mi, jaja.

Sería éste el código. No está como me lo pusiste porque alguno de los errores se controlaba al revés (salía el error cuando estaba bien):

<CODE>
if (isset ($_FILES["archivos"])) {

//de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
//obtenemos la cantidad de elementos que tiene el arreglo archivos
$tot = count($_FILES["archivos"]["name"]);
//este for recorre el arreglo
for ($i = 0; $i < $tot; $i++){

$nombre_archivo = $_FILES['archivos']['name'][$i];
$tipo_archivo = $_FILES['archivos']['type'][$i];
$tamano_archivo = $_FILES['archivos']['size'][$i];
$error_subida = $_FILES['archivos']['error'][$i];
$nombre_temporal = $_FILES['archivos']['tmp_name'][$i];
$directorio = '../../../imagenes/galeria/';
$fecha = date("d-m-y-G-i");

$error="";
if (empty ($nombre_archivo)){
$error.="Error: el archivo $fecha.$nombre_archivo no tiene nombre<br>";
}
elseif ($error_subida!=0)
{
$error.="Error en la subida del archivo $fecha.$nombre_archivo <br>";
}
elseif ($tamano_archivo > 1024000){
$error.="Error: el archivo $fecha.$nombre_archivo no se ha subido porque pesa más de 1 MB<br>";
}
else {
if (strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg") ||
strpos($tipo_archivo, "png")){}
else {
$error.="Error: el archivo $fecha.$nombre_archivo sólo puede ser de tipo gif, jpg o png.<br>";
}
}

if($error<>""){
echo $error;
continue;
}

if (move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $directorio.$fecha.$nombre_archivo)){

//Aquí irían instrucciones de actualización, las que sean
(...)=
(...)


?>
<table>
<tr>
<td width="12%" align="center" valign="middle">
<img src="http://www.forosdelweb.com/../imagenes/galeria/<?php echo $fecha.$nombre_archivo?>" align="middle" />
<br /> <br /> <br />
La imagen <?php echo $fecha.$nombre_archivo;?> fue subida correctamente
</td>
</tr>
</table>

<?php

}

}

}
  #6 (permalink)  
Antiguo 22/05/2012, 12:55
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: Problemas al subir varias imágenes

Pues este código parece correcto...se me ocurre lo siguiente:

1.puede ser un problema de css. Mira en el navegador dentro del código html, a ver si te sale la información en algún sitio. Prueba de encerrar los errores en un div. echo "<div>$error</div>";

2. En alguna parte de código que no vemos, se altera la variable $i.

3. tu error está en otra parte.

Igual si alguien más revisa el código encuentre algo, pero no lo creo.

Saludos.
  #7 (permalink)  
Antiguo 23/05/2012, 03:19
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Problemas al subir varias imágenes

Hola de nuevo. ¡Muchas gracias! Simplemente probé a meter los $error dentro de divs y ya está. Eso sí, todavía no me explico como encontraste el fallo y qué era exactamente lo que me fallaba.

El caso es que ahora estoy haciendo otro archivo de subida parecidísimo, pero que deja subir muchos más tipos de archivo (son cosas del trabajo, no lo hago por aburrimiento, jeje). Y estoy haciendo comprobaciones, y me da el mismo tipo de fallo (pantalla en blanco, no da mensajes de error ni sube los archivos correctos) cuando se intentan subir varios tipos de archivos distintos que cumplen con todos los requisitos (y uno a unos sí deja subir esos tipos de archivos sin problema). En concreto, después de muchas pruebas, creo haber acotado donde falla (aunque no tenga mucho sentido), y es con las combinaciones de cualquier otro tipo de archivo con pdf, png o ppt (si subo un montón de archivos del resto de tipos no hay problema).

Te pongo aquí el código por si puedes proponer algún posible cambio que lo pueda solucionar. El tipo de archivo lo comprobé haciendo echos, y para los de open office hay que poner ese tipo de extensión tan rara. Saludos, te voy a dar karma:

if (isset ($_FILES["archivos"])) {

//de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo
//obtenemos la cantidad de elementos que tiene el arreglo archivos
$tot = count($_FILES["archivos"]["name"]);
//este for recorre el arreglo
for ($i = 0; $i < $tot; $i++){

$nombre_archivo = $_FILES['archivos']['name'][$i];
$tipo_archivo = $_FILES['archivos']['type'][$i];
$tamano_archivo = $_FILES['archivos']['size'][$i];
$error_subida = $_FILES['archivos']['error'][$i];
$nombre_temporal = $_FILES['archivos']['tmp_name'][$i];
$directorio = '../../../imagenes/descarga/';
$fecha = date("d-m-y-G-i");

$error="";
if (empty ($nombre_archivo)){
?><div><?php $error.="Error: el archivo $fecha.$nombre_archivo no tiene nombre<br>";?></div><?php
}
elseif ($error_subida!=0)
{
?><div><?php $error.="Error en la subida del archivo $fecha.$nombre_archivo <br>";?></div><?php
}
elseif ($tamano_archivo > 3072000){
?><div><?php $error.="Error: el archivo $fecha.$nombre_archivo no se ha subid porque pesa más de 3 MB <br>";?></div><?php
}
else {
if (strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "pjpeg") || strpos($tipo_archivo, "x-png")
|| strpos($tipo_archivo, "octet-stream") || strpos($tipo_archivo, "vnd.oasis.opendocument.graphics")
|| strpos ($tipo_archivo, "vnd.oasis.opendocument.presentation")
|| strpos ($tipo_archivo, "vnd.oasis.opendocument.spreadsheet")
|| strpos ($tipo_archivo, "vnd.oasis.opendocument.text")
|| strpos ($tipo_archivo, "pdf") || strpos ($tipo_archivo, "rar")
|| strpos ($tipo_archivo, "text") || strpos ($tipo_archivo, "richtext")
|| strpos ($tipo_archivo, "tiff") ||strpos ($tipo_archivo, "xls") || strpos ($tipo_archivo, "odt")
|| strpos ($tipo_archivo, "plain") || strpos ($tipo_archivo, "zip")) {}
else {
?><div><?php $error.="Error: el archivo $fecha.$nombre_archivo sólo puede ser de tipo doc, docx, gif, jpg,
odg, odp, ods, odt, pdf, png, ppt, rar, rtf, tiff, txt, xls o zip.<br>";?></div><?php
}
}

if($error<>""){
echo $error;
continue;
}

if (move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $directorio.$fecha.$nombre_archivo)){

//Aquí irían instrucciones de actualización, las que sean
(...)
(...)

?>
<table>
<tr>
<td width="12%" align="center" valign="middle">
<img src="http://www.forosdelweb.com/../imagenes/descarga/<?php echo $fecha.$nombre_archivo?>" align="middle" />
<br /> <br /> <br />
La imagen <?php echo $nombre_archivo;?> fue subida correctamente
</td>
</tr>
</table>

<?php

}

}

}
  #8 (permalink)  
Antiguo 23/05/2012, 03:29
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: Problemas al subir varias imágenes

Sin leer tu código, prueba otra vez a poner divs en el echo $error.

Si no pirula, dimelo y esta tarde (en 5h) lo miro.

Salud!
  #9 (permalink)  
Antiguo 23/05/2012, 03:45
 
Fecha de Ingreso: marzo-2012
Ubicación: A Coruña
Mensajes: 29
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: Problemas al subir varias imágenes

Siento que hayas perdido algo de tiempo, pero ya sé qué me fallaba en este caso. Resulta que tengo un archivo .htaccess que limitaba a sólo 3 MB (lo mismo que puede ocupar cada archivo) el php_value post_max_size, es decir, los máximos megas que se pueden recibir a través de un post en un formulario.

Y justamente los archivos más grandes de los que subí eran el pdf, el png y el ppt. Así que si subía 2 de esos archivos me superaba los 3 MB, y por eso se quedaba en blanco.

Ya lo solucioné, al final le puse 100 MB máximos que se pueden recibir por post. Y así ya me funciona.

Un millón de gracias igualmente. ¡Saludos!
  #10 (permalink)  
Antiguo 23/05/2012, 03:47
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: Problemas al subir varias imágenes

Ok. Nos vemos por aquí.

Etiquetas: formulario, html, mysql, sql, variables
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 02:16.