2008-08-29 26 views
43

J'ai utilisé le plugin jQuery Form pour la soumission de formulaire asynchrone. Pour les formulaires contenant des fichiers, il copie le formulaire dans un iframe masqué, le soumet et recopie le contenu de l'iframe. Le problème est que je n'arrive pas à comprendre comment trouver le code d'état HTTP renvoyé par le serveur. Par exemple, si le serveur renvoie 404, les données de l'iframe seront copiées normalement et traitées comme des réponses régulières.Récupération du code d'état HTTP de l'iframe chargé avec Javascript

J'ai essayé de fouiller dans les objets iframe à la recherche d'un attribut status_code, mais je n'ai rien trouvé de tel.


La fonction $.ajax() ne peut pas être utilisé, car il ne prend pas en charge le téléchargement de fichiers. La seule façon de télécharger de manière asynchrone des fichiers que je connais est d'utiliser la méthode iframe cachée.

+1

ce que je veux dire, c'est que vous pouvez définir un délai pour le chargement de la page (sur le parent), et l'enfant (iframe) devrait définir une valeur dans le parent. si cette valeur n'est pas définie jusqu'au délai d'attente, l'iframe a échoué. – Dementic

Répondre

17

Vous ne pouvez pas obtenir les en-têtes de page par JS, mais vous pouvez distinguer l'erreur de succès: Essayez quelque chose comme ceci:

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

côté serveur:

/* 
    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 le fichier est trop volumineux, php aura 500, ce qui empêchera l'affichage de votre message d'erreur. – KyleWpppd

+0

ce n'est pas une solution ... – Isaac

-1

Vous ne pouvez pas récupérer le code d'état HTTP depuis "iframe" chargé directement. Mais lorsqu'une erreur http s'est produite, le serveur ne retournera rien à "iframe". Donc l'iframe n'a pas de contenu. vous pouvez vérifier le corps iframe, lorsque le corps de iframe est vide, utilisez ajax avec la même URL pour obtenir la réponse du serveur. Ensuite, vous pouvez récupérer le code d'état http de la réponse. Pourquoi ne pas lancer js sur le résultat iframe?

+0

Très faux. C'est juste un cas courant, mais pas même une convention ou une bonne pratique. Les serveurs HTTP doivent généralement envoyer un corps de réponse contenant un message d'erreur. – Lothar

+0

Dans le cas de l'utilisation de "iframe" pour télécharger un fichier, c'est différent avec la requête HTTP générale. En particulier, IE9 remplacera le corps "iframe" par la page d'erreur locale de la machine cliente à moins que le statut HTTP ne soit 200. Ainsi, lorsque vous essayez d'obtenir le corps de iframe, vous obtiendrez une erreur interdomaine. @Lothar –