Foros del Web » Programando para Internet » Javascript »

Validar multiples input file generados dinamicamente.

Estas en el tema de Validar multiples input file generados dinamicamente. en el foro de Javascript en Foros del Web. Hola, en una página le doy la posibilidad al usuario de crear varios input file para subir tantas imágenes como desee de una sola vez ...
  #1 (permalink)  
Antiguo 03/08/2009, 04:38
 
Fecha de Ingreso: febrero-2009
Mensajes: 77
Antigüedad: 15 años, 2 meses
Puntos: 0
Validar multiples input file generados dinamicamente.

Hola,
en una página le doy la posibilidad al usuario de crear varios input file para subir tantas imágenes como desee de una sola vez sin tener que ir almacenándolas de una en una. Esto lo hago dinámicamente con un link "Subir otra imagen", que automáticamente crea un nuevo input file debajo del anterior.

Ya se como validar el formato de un input file explicado en un post de forosdelweb.

Lo que ahora intento es poder validar TODOS esos input file mediante javascript para que ninguno esté vacío y el unico formato que admitan sea var ext=['gif','jpg','jpeg','png'];

En formularios con uno o varios input file que no están creados dinámicamente no tengo problema porque los referencio con document.formulario.input1.value document.formulario.input2 ..... pero aquí como a priori no se cuantos voy a tener no tengo muy claro como hacer la validación.

El código:

Código :

Código HTML:
<form name="formu" id="formu" action="upload_imagen.php" method="post" enctype="multipart/form-data"> 
     <dl>             
   <dt><label>Imagenes 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 /> 
   <input type="hidden" name="id_m" value= "<?php echo $id_marca ?>" /> 
   </div></dd> 
   <dt><a href="#" onClick="addCampo()">Subir otra imagen</a></dt>       
   <dd><input type="submit" value="Enviar" id="envia" name="envia" /></dd> 
     </dl> 
</form> 


Código :

Código:
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; 
}

Gracias, un saludo.
Javier.
  #2 (permalink)  
Antiguo 07/08/2009, 17:48
Avatar de jonasmz  
Fecha de Ingreso: agosto-2009
Ubicación: En frente de la compu :P
Mensajes: 32
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Validar multiples input file generados dinamicamente.

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.
  #3 (permalink)  
Antiguo 10/08/2009, 05:47
 
Fecha de Ingreso: febrero-2009
Mensajes: 77
Antigüedad: 15 años, 2 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....
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 13:06.