Ver Mensaje Individual
  #3 (permalink)  
Antiguo 10/08/2009, 05:47
riestra
 
Fecha de Ingreso: febrero-2009
Mensajes: 77
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Validar multiples input file generados dinamicamente.

Cita:
Iniciado por jonasmz Ver Mensaje
Código HTML:
<html>
<body>
<form>
<input type="file" id="i1" class="upfil" /><br /><br />
<input type="file" id="i2" class="upfil" /><br /><br />
<input type="file" id="i3" /><br /><br />
<input type="file" id="i4" /><br /><br />
<input type="file" id="i5" class="upfil" /><br /><br />
<input type="file" id="i6" /><br /><br />
<input type="file" id="i7" class="upfil" /><br /><br />
<input type="file" id="i8" class="upfil" /><br /><br />
<a href="#" onClick="seleccionar()">probar funcion</a>
</form>

<script type="text/javascript">

function seleccionar()
{
	//selecciono todos los 'inputs'
	var allinputs = document.getElementsByTagName("input");
	//creo un array para almacenar solo los inputs que voy a utilizar
	var inputs = new Array(); var j = 0; //La variable 'j' la utilizo como apuntador en el array 'input'
	//recorro todos los inputs recogidos
	for(i=0; i<allinputs.length; i++)
	{
		//extraigo los inputs con la clase especifica para subir archivos
		if (allinputs[i].className == "upfil")
		{
			//aca realizo el paso de los inputs(si el input tiene una clase 'upfil' entonces los aparto en un array en limpio)
			inputs[j] = allinputs[i];
			j++; //incremento el apuntador para el proximo input a almacenar
		}
	}
	comprobacion(inputs); //llamada a la funcion que comprueba los inputs en cuestion
}	

function comprobacion(iarray)
{	
	for(m=0; m < iarray.length; m++) //recorro el array con los inputs
	{
		var cadena1 = iarray[m].value; //tomo el valor del primer input
		var s = cadena1.lastIndexOf("."); //obtengo la posision del ultimo punto en la cadena(el que precede a la extencion) 
		var miarr = new Array("gif","png","jpeg","jpg"); //Declaro un array con las extensiones permitidas 
		for	(i = 0; i < miarr.length; i++) //bucle en el que compruebo las extensiones permitidas
		{
			var charfind = cadena1.substr(s+1,4); //extraigo las ultimas 4 letras despues del punto (posision 's+1')
			charfind = charfind.toLowerCase(); //convierto la extraccion a minisculas para evitar comprobaciones erroneas
			if(charfind == miarr[i]) //compruebo la extencion obtenida con las permitidas
			{
				alert("Archivo "+(m+1)+" validado"); //si es correcta aviso que esta validado
				iarray[m].style.border = 'inherit'; //limpio bordes por si es la segunda ejecucion
				iarray[m].style.color = 'black'; //limpio el color de letra por si es la segunda ejecucion
				break; //termino blucle
			}
			if(i == miarr.length - 1) //si se ha llegado a la ultima pasada en el bucle aviso que se ha introducido una extension erronea
			{
				iarray[m].style.border = '4px red solid'; //remarco el borde del elemento mal
				iarray[m].style.color = 'red'; //remarco fuente del elemento malo
				alert("Has introducido una extension erronea en archivo " + (m+1)); //envio alerta
			}
		}
	}
}
</script>
</body>
</html> 
Con esto lo unico que te queda por hacer es buscar la manera de agregar la clase a los inputs para que te valide la funcion. Fijate si te sirve, si no vemos alguna otra alternativa que podria ser con jquery.

Hola,
si te fijas mi código funciona de una forma diferente. Tal y como yo lo estaba haciendo la función de comprobar la asignaba al onChange() del input, de forma que el mensaje de formato inválido saltaba en cuanto se selecciona un elemento distinto a una imagen el input.

El código que tú has hecho lo que hace es comprobar todos los input una vez que están cargados y le das al link "probar función".
Lo que estoy tratando de hacer es lo que he dicho antes, que valide en cuanto se carga el input y que no lo haga solo con el primero sino con todos, el problema viene que se crean en tiempo de ejecución y no de compilación, entonces no se como podría validarlos de esa forma....