2010-06-10 48 views
1

第一部分描述在Unsafe JavaScript attempt to access frame, when try to upload file with ajax问题是当我尝试使用ajax-way上传文件时,我得到访问被拒绝错误。由于猿彗星服务器不能使用ajax-upload

经过长时间的调试,我发现如果我不加载ape客户端,一切都正常。猿是彗星服务器http://www.ape-project.org/

猿创建一个iframe与src =“http://8.ape.readbox.cz:6969/?...”。如果我禁用猿,并且这个iframe没有创建,那么我没有问题来访问为ajax上传创建的iframe的文档。

Togather他们看起来像

<iframe src="http://8.ape.readbox.cz:6969/?..." style="display: none; position: absolute; left: -300px; top: -300px;" id="ape_undefined"></iframe> 
<iframe style="display: none;" id="ValumsAjaxUpload0" src="javascript:false;" name="ValumsAjaxUpload0"></iframe> 

请,任何人可以帮助我吗?我很困惑。

回答

2

不幸的是,我不能给你一个具体的解决方案。问题的要点如下:

为了使APE进行跨域(实际上是子域)POST调用,ape需要重置document.domain(一个全局窗口变量),摆脱域前缀(www。,beta。等)。虽然0.ape.YOURDOMAIN.com是从www.YOURDOMAIN.com跨域限制的,但它允许来自YOURDOMAIN.com的同域权限。不幸的是,为了让你的上传器iframe访问父窗口,它也需要来自同一个域。重置document.domain改变了。

一个解决方案是将APE的默认XHR方法从'POST'更改为'GET'。您显然可以从外部域获取请求,但是您可以发送的数据量有限。另外,您必须注释掉在您的页面上重置document.domain的JavaScript行。

这不是您可能正在寻找的伟大的可靠解决方案,但我希望它能解决问题的根源。

0

我使用jQuery Form Plugin和APE慧星服务器,并坚持与使用iframe上传文件相同的问题。 这里是我的解决方案(使用静态的iframe,而不是动态的):

添加以下代码到网页中,被载入前开始APE:

<iframe id="file_upload_iframe" name="file_upload_iframe" src="iframe_src.html" style="position: absolute;left: -300px;top:-300px; width:0px;height:0px;"></iframe> 

添加到网站的页面iframe_src.html(静态iframe的初始来源):

<html> 
<head> 
</head> 
<body> 
<script type="text/javascript"> 
    document.domain = document.domain; <!-- this is the main line --> 
</script> 
</body> 
</html> 

此页面的目的是为了允许表单插件进行初始表单提交,避免许可错误。
应用程序应返回下列方式响应:

<html> 
<head></head> 
<body> 
<script type="text/javascript">document.domain = document.domain;</script> 
<textarea>' + YOUR_DATA_TO_RETURN + '</textarea> 
</body> 
</html> 

这是为了避免权限被拒绝错误在第二和进一步的表单提交。

代码在客户端提交表单:

$('#image_add_commit').click(function(){ 
    $('#file_upload_iframe').unbind();//may be it is unnecessary 
    $('#image_add_form').ajaxSubmit( 
     {success: image_add_complete, 
     iframe: true, 
     iframeTarget: $('#file_upload_iframe').get(0), 
     dataType: 'html', 
     textarea: true}); 
}); 

function image_add_complete(data){ 
    //data variable contains YOUR_DATA_TO_RETURN that was wrapped in HTML code 
} 

变形在jquery.form。js文件:

查找块

  if (!s.iframeTarget) { 
       // add iframe to doc and submit the form 
       $io.appendTo('body'); 

       if (io.attachEvent) 
        io.attachEvent('onload', cb); 
       else 
        io.addEventListener('load', cb, false); 
      } 

,并更改为

 if (!s.iframeTarget) { 
      // add iframe to doc and submit the form 
      $io.appendTo('body'); 
     } 
      if (io.attachEvent) 
       io.attachEvent('onload', cb); 
      else 
       io.addEventListener('load', cb, false); 

(这只是移动第二大括号高达)