2010-06-10 44 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); 

(這只是移動第二大括號高達)