2008-08-29 12 views
43

Utilicé el complemento jQuery Form para el envío asíncrono de formularios. Para los formularios que contienen archivos, copia el formulario en un iframe oculto, lo envía y copia el contenido del iframe. El problema es que no puedo encontrar la forma de encontrar qué código de estado HTTP devolvió el servidor. Por ejemplo, si el servidor devuelve 404, los datos del iframe se copiarán de forma normal y se tratarán como una respuesta normal.Recuperación del código de estado HTTP del iframe cargado con Javascript

He intentado hurgar en los objetos del iframe en busca de algún tipo de atributo status_code, pero no he podido encontrar nada de eso.


La función $.ajax() no se puede utilizar, ya que no soporta la carga de archivos. La única forma de subir archivos de forma asíncrona que conozco es utilizando el método oculto iframe.

+1

¿por qué no ejecutar algunos js en el resultado iframe? lo que quiero decir es que puede establecer un tiempo de espera para la carga de página (en el elemento principal) y el elemento secundario (iframe) debe establecer un valor en el elemento primario. si ese valor no se establece hasta el tiempo de espera, el iframe falló. – Dementic

Respuesta

17

No se puede obtener los encabezados de página de JS, pero se puede distinguir de error de éxito: Pruebe algo como esto:

<script type="text/javascript"> 

    var uploadStarted = false; 
    function OnUploadStart(){    
     uploadStarted = true; 
    } 

    function OnUploadComplete(state,message){  

     if(state == 1) 
     alert("Success: "+message);  
     else 
     if(state == 0 && uploadStarted) 
      alert("Error:"+(message ? message : "unknow")); 
    } 

</script> 


<iframe id="uploader" name="uploader" onload="OnUploadComplete(0)" style="width:0px;height:0px;border:none;"></iframe> 

<form id="sender" action="/upload.php" method="post" target="uploader" enctype="multipart/form-data" onsubmit="OnUploadStart()"> 
<input type="file" name="files[upload]"/> 
<input type="submit" value="Upload"/> 
</form> 

En el lado del servidor:

/* 
    file: upload.php 
*/ 
<?php 

    // do some stuff with file  

    print '<script type="text/javascript">'; 
    if(success) 
    print 'window.parent.OnUploadComplete(1,"File uploaded!");'; 
    else 
    print 'window.parent.OnUploadComplete(0, "File too large!");'; 
    print '</script>'; 
?> 
+3

Si el archivo es demasiado grande, php 500, impidiendo que se muestre su mensaje de error. – KyleWpppd

+0

esto no es una solución ... – Isaac

-1

No se puede recuperar el código de estado HTTP del "iframe" cargado directamente. Pero cuando se produce un error http, el servidor no devolverá nada al "iframe". Entonces, el iframe no tiene contenido. puede verificar el cuerpo del iframe, cuando el cuerpo del iframe está en blanco, use ajax con la misma url para obtener la respuesta del servidor. Luego puede recuperar el código de estado http de la respuesta.

+0

Muy mal. Este es solo un caso común, pero ni siquiera es una convención o una buena práctica. Los servidores HTTP generalmente deben enviar un cuerpo de respuesta que contenga un mensaje de error. – Lothar

+0

En el caso de usar "iframe" para descargar un archivo, es diferente con la solicitud HTTP general. En particular, IE9 reemplazará el cuerpo "iframe" con la página de error local de la máquina cliente a menos que el estado HTTP sea 200. Por lo tanto, cuando intente obtener el cuerpo de iframe, obtendrá un error entre dominios. @Lothar –