使用Javascript从加载的iframe中获取HTTP状态码

47

我使用了jQuery Form插件进行异步表单提交。对于包含文件的表单,它会将表单复制到一个隐藏的iframe中,然后提交表单,并复制回iframe的内容。问题是我无法找出服务器返回的HTTP状态代码。例如,如果服务器返回404,则来自iframe的数据将被正常复制并视为常规响应。

我尝试在iframe对象中寻找某种status_code属性,但是没有找到类似的东西。


$.ajax()函数不能使用,因为它不支持上传文件。我知道的唯一一种异步上传文件的方法是使用隐藏的iframe方法。


1
为什么不在结果iframe上运行一些js呢? 我的意思是,您可以为页面加载(在父级上)设置超时,而子级(iframe)应该在父级中设置一个值。 如果该值在超时之前未设置,则iframe失败。 - Rafael Herscovici
如果您首先将文件读入字符串,然后像普通的旧POST一样提交它,那么可以使用ajax。 - Hashbrown
2个回答

19

你无法通过JS获取页面头信息,但你可以区分错误和成功:尝试像这样:

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

在服务器端:

/*
  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
如果文件太大,PHP 将会返回 500 错误,这会阻止错误信息的显示。 - KyleWpppd

-4
您无法直接从已加载的 "iframe" 获取 HTTP 状态代码。 但当发生 HTTP 错误时,服务器将不会向 "iframe" 返回任何内容。 因此 iframe 没有内容。 当 iframe 的 body 为空时,您可以检查 iframe body,并使用相同的 URL 进行 ajax,以从服务器获取响应。然后,您可以从响应中检索 HTTP 状态代码。

2
非常错误。这只是一个普通情况,甚至不是惯例或良好的实践。HTTP服务器通常应该发送包含错误消息的响应体。 - Lothar
在使用“iframe”下载文件时,与一般的HTTP请求不同。特别是,除非HTTP状态为200,否则IE9将用客户端机器上的本地错误页面替换“iframe”主体。因此,当您尝试获取iframe的主体时,会出现跨域错误。@Lothar - choi gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接