Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/05/2012, 05:38
el_cos
 
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!