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" />
<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.