« # »

Up!, librería para subir archivos de forma oculta.

Ideal para CMSs, este script os puede ayudar a hacer varios uploads sin tener que recargar la página. Aparte, os dejará enviar un formulario de la misma forma.

JavaScript:
  1. up={
  2.     load:function(formulari,callBack){
  3.         var frame=up.creaFrame();
  4.         document[formulari].target=frame;
  5.         document.getElementById(frame).onComplete=callBack;
  6.         document[formulari].submit();
  7.     },
  8.     creaFrame:function(){
  9.         var frame='f'+Math.floor(Math.random()*99999);
  10.         var d=document.createElement('DIV');
  11.         d.innerHTML='<iframe style="display:none" src="about:blank" id="'+frame+'" name="'+frame+'" onload="up.loaded(\''+frame+'\')"></iframe>';
  12.         document.body.appendChild(d);
  13.         return frame;
  14.     },
  15.     loaded:function(id){
  16.         var frame=document.getElementById(id);
  17.         if (frame.contentDocument){var d = frame.contentDocument;
  18.         }else if (frame.contentWindow){var d = frame.contentWindow.document;
  19.         }else{var d = window.frames[id].document;}
  20.         if(d.location.href=="about:blank"){return;}  
  21.         if(typeof(frame.onComplete)=='function'){frame.onComplete(d.body.innerHTML);}
  22.     }
  23. };

Está basado en un script que encontró Santi (un compañero de CDmon) y lo modifiqué para minimizar el peso y para obtener el resultado que yo quería (basicamente pulí toda la paja y ahora sólo lanza el callBack cuando ha terminado de cargar el archivo).

Os dejo un ejemplo de uso:

JavaScript:
  1. <script type="text/javascript">
  2. function cons_upload_arxiu(){
  3.     dup=document.cons_upload;
  4.     if(dup.arxiu.value==""){alert("Falta seleccionar un arxiu!!");return false;}
  5.     var id = d("cons_referencia").value;
  6.    
  7.     dup.id.value=id;
  8.  
  9.     up.load("cons_upload",cons_ok_upload);
  10.     return false; //para que no envíe el formulario en la página principal
  11. }
  12. function cons_ok_upload(retorno){
  13.     alert(retorno);
  14. }
  15. </script>

HTML:
  1. <form id="cons_upload" name="cons_upload" action="cons_detall.php" method="post" enctype="multipart/form-data">
  2.     <label>Adjuntar arxiu:</label>
  3.     <input name="arxiu" type="file" />
  4.     <input value="Adjuntar arxiu" type="submit" onclick="cons_upload_arxiu();" />
  5. </form>

El archivo cons_detall.php es el que procesa la subida del archivo.

Espero que os sea útil! :)

Comentarios

  1. josepzin | noviembre 24th, 2007 | 11:02 am

    Te odio… la semana pasada estuve haciendo casi lo mismo… ¿porque no publicaste esto antes?? :D:D

    Lo que hice yo fue poner en el form un target=iframe, para subir el archivo y no recargar la pagina. Pero veo que tu codigo lo hace de otra manera. Habrá que probarlo.

  2. marc | noviembre 24th, 2007 | 6:08 pm

    jeje, lo siento Jose, recuperé este código el viernes retocando un panel interno.

  3. josepzin | noviembre 26th, 2007 | 1:56 pm

    Estuve probando el codigo, creo que te has dejado algo de una de estas librerias prototype (lo digo por el “.onComplete”, que no he encontrado eso en los eventos Javascript.

    Y un par de cosas que no me funcionaron, y como no entendía porque, pero si lo que querías hacer, lo modifiqué… de todos modos voy a mirar de nuevo, seguro que la culpa es mia porque apenas estoy con JS.

  4. marc | diciembre 3rd, 2007 | 12:37 pm

    Um… veamos, el onComplete lo defines tu y se lanza cuando se ha completado la carga del archivo, es por eso que hay onComplete, es como si le quiero llamar “alFinalizar” o cualquier nombre.

    ¿Si no te funciona, porque no montas un ejemplo, me pasas la URL y así lo reviso? :)

  5. Avoi | febrero 2nd, 2010 | 2:38 pm

    Magnifica función! Me ha funcionado a la primera,
    con solo cambiar el nombre de las funciones.

    Muchas gracias! Magnifico trabajo!
    Suerte!

  6. Emily | mayo 19th, 2011 | 6:20 pm

    Hola! Estoy intentando hacer esto pero para Blackberry… Llevo días probando varias opciones y lamentablemente es más complicado de lo que parecía. Si hiciera submit del formulario y ya sería super sencillo (de hecho funciona), pero el rollo es que me lleva a la respuesta del servidor y es imposible volver a mi App de nuevo…

    Me gustaría probar esta opción. ¿No subiste el código? Estoy bastante novata en este campo, pero bueno, sigo dando vueltas en varias posibilidades..

    Saludos!

Deja un comentario

(*: Datos necesarios para dejar un comentario)

Get Adobe Flash playerPlugin by wpburn.com wordpress themes