Foros del Web » Programando para Internet » Javascript »

input file dinamico con nombre dinamico - foto[] - Problema en firefox

Estas en el tema de input file dinamico con nombre dinamico - foto[] - Problema en firefox en el foro de Javascript en Foros del Web. Saludos a la Comunidad. Bueno mi problema es el siguiente. Tengo el tipico script para crear input de tipo file de forma dinamica, para que ...
  #1 (permalink)  
Antiguo 31/08/2009, 04:42
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
input file dinamico con nombre dinamico - foto[] - Problema en firefox

Saludos a la Comunidad.

Bueno mi problema es el siguiente. Tengo el tipico script para crear input de tipo file de forma dinamica, para que asi se suba exactamente los archivo que el usuario quiere subir. El codigo (a continuacion) funciona perfectamente en IE8 (si alguien tiene la oportunidad de probarlo en alguno anterior se lo agradeceria) pero en firefox el array que deberia contener los archivos, me aparece vacio.

No estoy seguro si el problema viene de php (si fuera asi agradeceria que se cambiara el tema al sector indicado) o de la creacion dinamica por Javascript.

Desde mi opinion y juzgando que en ie8 funciona sin problemas, pienso que debe ser la forma en la que especifico el nombre al elemento en javascript.

He buscado informacion y basandome en la logica (nombre[] en php deberia entenderlo como array) pero no encontre nada que me ayudase.

Aqui os dejo el codigo javascript:

Código HTML:
function addCampo() { 

   nDiv = document.createElement('div');
   nDiv.className = 'text3';
   nDiv.id = 'file' + (++numero);
   nCampo = document.createElement('input');
   nCampo.setAttribute('name','foto_inmueble[]');
   nCampo.setAttribute('type','file');
   nCampo.setAttribute('class','text3');
   nCampo.name = 'foto_inmueble[]';
   nCampo.type = 'file';
   nCampo.className = 'text3';
   nCampo.onchange = function() {if(this.value!=''){addCampo();}};
   a = document.createElement('a');
   a.setAttribute('class','text');
   a.setAttribute('name',nDiv.id);
   a.setAttribute('href','#');
   a.className = 'text';
   a.name = nDiv.id;
   a.href = '#';
   a.onclick = elimCamp;
   a.innerHTML = '[x]';
   nDiv.appendChild(nCampo);
   nDiv.appendChild(a);
   container = document.getElementById('adjuntos');
   container.appendChild(nDiv);
}
aqui el php:
Código PHP:
 for ($i=0$i<INMNUMFOT 1$i++)
            {
            
$foto_actual "foto_inmueble";
            
$comentario_actual "comentario_foto".$i;
            
$foto $_FILES[$foto_actual]['tmp_name'][$i];
            
$foto_name $_FILES[$foto_actual]['name'][$i];
            
$foto_type $_FILES[$foto_actual]['type'][$i];
            
$foto_size $_FILES[$foto_actual]['size'][$i];
            
print_r($_FILES);
            
$subida subir_imagen$foto$foto_name$foto_size$foto_type$_POST[max] ,DIRECTORIOIMAINM$UPL1[$_SESSION['idioma']]); 

aqui la funcion subir
Código PHP:
function subir_imagen($fichero$fichero_name,$fichero_size,$fichero_type,$max,$directorio$menerr)
    {
    if(empty(
$fichero_name) )
         {
         
$result[]= "nada";
         return 
$result;
         } else {

         if ((
$fichero_size $max) && (($fichero_type=="image/gif") || ($fichero_type=="image/jpeg") || ($fichero_type=="image/pjpeg") || ($fichero_type=="image/x-png") || ($fichero_type=="image/bmp") ))
             {
             
$extension substr($fichero_name,-4);
             
$nombre_finaluniqid(time()).$extension;

             if(
move_uploaded_file($fichero $directorio $nombre_final))
                {
                
$result[]= "subida";
                
$result[]= $nombre_final;
                return 
$result;
                }

             } else {
             
$peso$max/1024/1000;
             
$result[]= "error";
             
$result[]= $menerr." ".$peso." Mb.";
             return 
$result;
             }
         }
     } 

Pd. (el codigo php, el for se cierra mas adelante, lo que pasa que hago trecientas cosas en base de datos.. pero eso son inconcluyente para el error que os digo)
Pd. (El aray que me devuelve el firefox es array() en ie si me viene lleno);
  #2 (permalink)  
Antiguo 31/08/2009, 05:03
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: input file dinamico con nombre dinamico - foto[] - Problema en firefox

Hola:

Algunos navegadores no asignan bien el atributo name, así que posiblemente recibas los ficheros desde el array FILES pero con otro nombre (sin nombre)...

Para elementos de un formulario tal vez sea mejor clonar el elemento original que tengas, o clonar alguno que esté oculto en algún rincón de la página... suena a chapuza, pero es una solución que funciona.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 31/08/2009, 06:05
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: input file dinamico con nombre dinamico - foto[] - Problema en firefox

mmm no termino de comprender muy bien...

Original, no hay, ya que se genera dinamicamente (desde el primero, la funcion se carga con un window.onload=addCampo();)

y a clonar... que te refieres exactamente?

ha crear un input hidden, con las propiedades que quiero, y luego desde javascript traerme los valores y meterlo en el input dinamico?

Si es esto lo que te refieres..esto no me ayuda con la creacion dinamica del nombre, ya que necesito que cambie cada vez para poder subir varios archivos.


Pense en ponerle cuando genero el nombre que en vez de ponerlo en forma de array ('foto[]'), meterle un contador cada vez que se llame a la funcion ('foto' + cont), pero haciendo esto solo me sube el ultimo archivo ya que el $_files solo almacena uno.

antes de ser dinamico tenia un puñado de input de este tipo:
Código:
 <input type="file" name="foto_inmueble[]" class="text3" style="background-color:#FFFFFF;" />
y funcionaba.. el problema es la asignacion del nombre.. pero perdona si mi ignoracia no me permite ver lo que me intentas expresar, pero no veo como solucionar lo de la asignacion de nombre "clonando" si por clonar, te refieres a lo que dije antes...si no, te ruego me lo explique algo mas conciso (a mi si no son con marionetas y colorines,xDD)


P.d: referente al tema de la asignacion en los diferente navegadores, hasta ahora siempre habia tenido ese problema con explore, mi forma de añadir los attibutos, era con el setAttribute(); pero nuestro amigo explore no es muy partidario de esto, por ello la reiteracion de los campos pero alterando directamente al doom (elemento.propiedad=loquesea). y hasta ahora no me dio problema, el fallo esta en crear el array de esa forma y de verdad estoy un tanto blokeado...gracias de nuevo por vuestra atencion

Última edición por kikeking1; 31/08/2009 a las 06:10
  #4 (permalink)  
Antiguo 31/08/2009, 06:21
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: input file dinamico con nombre dinamico - foto[] - Problema en firefox

anteriormente he creado formulario dinamicos pero nunca pense que puedieran tener problema en el servidor. nunca habia escuchado que hay navegadores que tienen problema en asignar el nombre, supongo que especificamente en inputs de tipo file. mi ignorancia debido a que no trabajo en el lado servidor. caricatos, si puedieras abundar un poco mas de informacion acerca del tema.

kike, en cuanto a lo de clonar, es una funcion que provee el DOM para eso mismo, duplicar elementos. en este caso, tienes un campo file de forma predeterminada. cuando quieras agregar un nuevo campo, en lugar de usar funciones como createElement, usas cloneNode y este te devuelve el elemento clonado con los mismos atributos y valores, con excepcion de eventos asociados al elemento. es facil de usar:

Código:
file = document.formulario.input_file.cloneNode(false);
elemento.appendChild(file);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 31/08/2009, 09:57
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: input file dinamico con nombre dinamico - foto[] - Problema en firefox

Hola:

El ejemplo de clonar es el que pone zerokilled, pero para clonarlo con sus atributos e hijos (los file no pueden tenerlos), el parámetro debe ser true...

La cosa sería así:

<span id="clonador"><input type="file" name="foto_inmueble[]" class="text3" style="background-color:#FFFFFF;" /></span>

y el script sería...

clon = document.getElementById("clonador").firstChild.clo nenode(true);
/* equivale a
clon = document.createElement("input");
clon.type = "file";
clon.name = "foto_inmueble[]";
clon.className = "text";
clon.style.backgroundColor = "#FFFFFF";
*/

También podría clonar un elemento por su id, pero como no pueden repetirse, luego deberías cambiarlo... otra cosa que debes controlar es que se trate del primer tag hijo, o sea que no debe existir ni un espacio...

Pruébalo y nos comentas...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 01/09/2009, 02:59
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: input file dinamico con nombre dinamico - foto[] - Problema en firefox

Bueno mi funcion addCampo se ha quedado asi

Código PHP:
function addCampo() { 

   
//nDiv = document.createElement('div');
   //nDiv.className = 'text3';
   //nDiv.id = 'file' + (++numero);
   
nCampo document.getElementById("adjuntos").firstChild.cloneNode(true);
   
nCampo.onchange = function() {if(this.value!=''){addCampo();}};
   
document.createElement('a');
   
a.setAttribute('class','text');
   
a.setAttribute('name',nDiv.id);
   
a.setAttribute('href','#');
   
a.className 'text';
   
a.name nDiv.id;
   
a.href '#';
   
a.onclick elimCamp;
   
a.innerHTML '[x]';
  
// nDiv.appendChild(nCampo);
   //nDiv.appendChild(a);
   
container document.getElementById('adjuntos');
   
container.appendChild(nCampo);
   
container.appendChild(a);
   
//container.appendChild(nDiv);

He eliminado el contenedor que lo crea dinamicamante, para evitar tener problemas a la hora de controlar a los hijos y tal.


el codigo html se quedo asi:

Código:
   <div id="adjuntos" class='text3' align='center'>
<input type='file' name='foto_inmueble[]' class='text3' onchange='addCampo();'>  
   </div>

Pero no afecto en nada al funcionamiento, tanto para ie como para mf.

el mf me devuelve el array como este :

Código HTML:
Array ( [foto_inmueble] => Array ( [name] => Array ( [0] => Ursula.jpg ) [type] => Array ( [0] => image/jpeg )....
Mientras que ir devuelve el que seria el correcto:

Código HTML:
Array ( [foto_inmueble] => Array ( [name] => Array ( [0] => tiburon martillo.jpg [1] => travesti.jpg [2] => Ursula.jpg [3] => up.gif [4] => Ursula.jpg [5] => ) [type] => Array ( [0] => image/pjpeg [1] => image/pjpeg [2] => image/pjpeg ....
Gracias por vuestro apoyo.
  #7 (permalink)  
Antiguo 07/09/2009, 01:25
 
Fecha de Ingreso: junio-2009
Mensajes: 128
Antigüedad: 14 años, 10 meses
Puntos: 17
Respuesta: input file dinamico con nombre dinamico - foto[] - Problema en firefox

¿apoyo?....

Si alguien no ve claro la forma de la que lo estoy haciendo y conoce una mejor porfavor que me la comunique.

La idea es poner un input type file que al cargarle un archivo (mediante onchange y javascript) cree otro input igual para poder subir todos los archivos que queramos de una vez.

Todo esto funcuiona perfectamente, teniendo mi problema a la hora recojer los datos con firefox, (en ie funciona bien), la forma de denominar a los archivos es name="foto[]".


Y de paso si alguien tiene alguna idea de como evitar que el explorador corte la subida, al superar el tiempo de conexion . (es decir cuando subo mas de 3 megas. se corta el envio, y no sube el archivo, si es menos de 3 megas si)
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 16:20.