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