Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Usando iframes para subir archivos (alternativa a AJAX)

Estas en el tema de Usando iframes para subir archivos (alternativa a AJAX) en el foro de Frameworks JS en Foros del Web. Buenas a todos. Despues de buscar como @#¢∞$ se enviaban archivos usando AJAX, y de descubrir finalmente que no se puede, he encontrado un script ...
  #1 (permalink)  
Antiguo 06/10/2009, 15:17
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 17 años, 5 meses
Puntos: 1
Usando iframes para subir archivos (alternativa a AJAX)

Buenas a todos.

Despues de buscar como @#¢∞$ se enviaban archivos usando AJAX, y de descubrir finalmente que no se puede, he encontrado un script que hace la trampa de parecer que es AJAX. Lo he probado y funciona correctamente, pero tengo algunas dudas sobre el funcionamiento que no comprendo.

El codigo es el siguiente:
Código PHP:
<?php
if(isset($_GET['LOADING'])){
header("Content-type:image/gif");
echo 
base64_decode('R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
exit;
}
if(isset(
$_FILES['archivo'])){
    if(
10240000 $_FILES['archivo']['size']){
        
$tmp $_FILES['archivo']['tmp_name'];
        
$name $_FILES['archivo']['name'];
        if(
move_uploaded_file($tmp$name)){
            echo 
'
            <script>
            parent.document.getElementById("loading").style.display="none";
            parent.document.getElementById("mensaje").innerHTML="Archivo grabado correctamente";
            old_f=parent.document.getElementById("archivo");
            new_f=parent.document.createElement("input");
            new_f.type="file";
            new_f.name="archivo";
            new_f.value="";
            new_f.id="archivo";
               new_f.onchange=function(){
                parent.document.getElementById("mensaje").innerHTML="";
            }
            old_f.parentNode.replaceChild(new_f,old_f);
            </script>'
;
            exit;
        }
    }
echo 
'
            <script>
            parent.document.getElementById("loading").style.display="none";
            parent.document.getElementById("mensaje").innerHTML="El archivo no pudo grabarse.";
            old_f=parent.document.getElementById("archivo");
            new_f=parent.document.createElement("input");
            new_f.type="file";
            new_f.name="archivo";
            new_f.value="";
            new_f.id="archivo";
               new_f.onchange=function(){
                parent.document.getElementById("mensaje").innerHTML="";
            }
            old_f.parentNode.replaceChild(new_f,old_f);
            </script>'
;
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>test</title>
</head>

<body>
<form target="pepe" method="post" enctype="multipart/form-data" action="<?php echo basename($_SERVER['PHP_SELF'])?>" onsubmit="if(document.getElementById('archivo').value.length)document.getElementById('loading').style.display='inline'">
<div id="mensaje" style="font-family:Verdana, Arial, Helvetica, sans-serif; color:red; font-size:9px"></div>
<input type="file" name="archivo" id="archivo" size="26" class="campoArchivo" onchange="document.getElementById('mensaje').innerHTML=''" />
<input type="submit" value="Cargar archivo" />
&nbsp;<img id="loading" src="?LOADING" width="16" height="16" style="display:none" />
</form>
<iframe name="pepe" width="1" height="1" style="visibility:hidden"></iframe>
</body>
</html>
La primera es sobre el condicional de la primera linea, if(isset($_GET['LOADING'])){. No comprendo por qué está ahi, pero más duda me genera el ver que esa variable viene del src="?LOADING" de una imagen que nada tiene (o entiendo que nada tendria) que ver con el formulario. No entiendo como pasa a ser una variable $_GET, cuando el formulario se envia a traves del metodo POST. Vamos, que no entiendo nada de esto.

La segunda duda, es sobre la linea del base64_decode('R0lGODlhEAAQAPIAA..... Tampoco entiendo por qué esta ahi ni para que sirve.

La tercera y definitiva, es sobre el uso del iframe. Buscando he visto que todo el mundo da como solucion alternativa usar un iframe oculto, y he visto que el formulario tiene un target hacia uno (cuyo id aun no he resuelto a entender por qué se llama "pepe"), pero no entiendo por qué se usa un iframe ni como ni donde se ejecuta la solicitud del formulario, ni por qué debe ser oculto.

Agradezco cualquier aclaración al respecto.
  #2 (permalink)  
Antiguo 07/10/2009, 07:50
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Usando iframes para subir archivos (alternativa a AJAX)

Trataré de explicar algunos puntos:
- En realidad esa imagen que parece no tener nada apuntaría a SELF?LOADING. Si ingresas esa URL en tu navegador verás que se muestra una imagen de carga. Eso se debe a la primera comprobación, cuando se recibe un parámetro por GET "LOADING" se envía esa imagen (ese base64_decode('....') es la imagen en sí)
- ¿Por qué se llama "pepe"? Lo puso el creador del script (parece ser un script de Panino5001), puede ser cualquier otro nombre.
- ¿Por qué se usa un iframe? Para enviar el formulario sin recargar la página.
- ¿Por qué tiene que ser oculto? No es que necesariamente tenga que serlo, pero es que no tendría sentido mostrarlo al usuario.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 07/10/2009, 10:19
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: Usando iframes para subir archivos (alternativa a AJAX)

Cita:
Iniciado por David Ver Mensaje
Trataré de explicar algunos puntos:
- En realidad esa imagen que parece no tener nada apuntaría a SELF?LOADING. Si ingresas esa URL en tu navegador verás que se muestra una imagen de carga. Eso se debe a la primera comprobación, cuando se recibe un parámetro por GET "LOADING" se envía esa imagen (ese base64_decode('....') es la imagen en sí)
Lo he comprobado y es como dices, aparece una imagen de carga, la cosa es que esa imagen no la tengo en el servidor. ¿Significa que base64_decode('.....') tiene una direccion desde la que descarga esa imagen?¿O es la imagen en sí?

De hecho, si hago un echo base64_decode('...') me aparecen en la pantalla lo siguiente:

GIF89a��ò��ÿÿÿ���ÂÂÂBBB���bbb‚‚‚’’’!þCreated with ajaxload.info�!ù� ���!ÿ NETSCAPE2.0���,�������3ºÜþ0ÊIkc:œ N˜f E±1º™Á¶.`ÄÂqÐ-[9ݦ9 JkçH��!ù� ��,�������4ºÜþNŒ! „ »°æŠDqBQT`1 `LE[¨|µußía€ ×â†C²%$*�!ù� ��,�������6º2#+ÊAÈÌ”V/…côNñIBa˜«pð ̳½ƨ+YíüƒÃ2©dŸ¿�!ù� ��,�������3ºb%+Ê2†‘ìœV_…‹¦ …! 1D‡aªF‚°ÑbR]ó=08,Ȥr9L��!ù� ��,�������2ºr'+JçdðóL &vÃ`\bT”…„¹hYB)ÏÊ@é<Ã&,ȤR’��!ù� ��,�������3º Â9ãtç¼Úž0Çà!.B¶ÊW¬¢1  sa»°5÷•0° ‰»Ÿm)J��!ù� ��,�������2ºÜþð ÙœU]šîÚqp•`ˆÝaœÝ4–…AFÅ0`›¶ Â@›1€ÂÖΑ��!ù� ��,�������2ºÜþ0ÊI«eBÔœ)×à ŽÇq10©Ê°®PÂaVÚ¥ ub‚ž[��;���������

Cita:
Iniciado por David Ver Mensaje
- ¿Por qué se usa un iframe? Para enviar el formulario sin recargar la página.
- ¿Por qué tiene que ser oculto? No es que necesariamente tenga que serlo, pero es que no tendría sentido mostrarlo al usuario.
Sobre esto, sigo sin entender por qué tiene que ser oculto, ya que lo he puesto visible y no ha pasado nada que fuese diferente.

La cuestion del iframe viene a cuento de que no sé que es lo que pasa cuando se hace un target='pepe'. Lo que he entendido (no se si bien o mal) hasta ahora, es que con este script la página se recarga y al encontrar una serie de valores (como el ?LOADING) lanza un script que hace algo (subir el archivo e imprimir un mensaje de ok). El tema es que, si eso es asi, ¿para que el iframe? Entonces pienso "ah, el iframe es donde se carga el script php que se encarga de subir y grabar el archivo en el servidor, y está oculto para que no se vea feo, todo esto sin recargar la pagina". Pero claro, me estoy contradiciendo en mi razonamiento, ya que por un lado digo que la pagina se recarga y por el otro digo que no. Luego despues de llegar hasta este punto, se me hace un nudo en el cerebro.

Simplemente quiero entender el funcionamiento de este programa, para poder aplicarlo, modificarlo o tirarselo a la cabeza a alguien cuando lo necesite.

P.D.: con todo esto, queda claro que hay algunas cosas sobre las que tengo mas bien poca idea, como el tema de los iframes, las variables del tipo SELF o incluso las tipo GET, ya que tampoco entiendo por qué el hecho de que la fuente de la imagen sea ?LOADING hace que esta se convierta en una variable GET
  #4 (permalink)  
Antiguo 07/10/2009, 10:27
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Usando iframes para subir archivos (alternativa a AJAX)

Como te dije, no es obligatorio que esté oculto; la razón por la que en el código de ejemplo está oculto es porque simplemente no hay por qué mostrar ese iframe al usuario.

La página no se recarga, el formulario se envía al iframe, se procesa en el iframe, y el resultado se devuelve en el iframe (Más información: iframe)

Y en cuanto a la imagen, esa información que se imprime con base64_encode('....') es la imagen en sí.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 07/10/2009, 10:45
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: Usando iframes para subir archivos (alternativa a AJAX)

ahhh, creo que ya voy comprendiendo.

La pagina no se recarga, sino que se llama a si misma pero su codigo se ejecuta dentro del iframe.

Por eso mi duda sobre el if(isset($_GET['LOADING'])){

Muchas gracias por tu ayuda
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:11.