2013-12-12 18 views
1

我維護一個使用CKeditorsimogeo Filemanager一起使用的web應用程序。在某些時候(我很遺憾,不確定何時)文件上傳功能停止工作。這不是一個服務器代碼問題(至少不是直接的),因爲XHR請求永遠不會發送到服務器。除此之外,這個問題很難診斷,因爲當請求失敗時,我從瀏覽器獲取信息的方式並不多。爲什麼在訪問服務器之前中止XMLHTTPRequest?


爲了簡化調試我使用AJAX文件上傳樣本的修改後的版本在這裏:https://github.com/New-Bamboo/example-ajax-upload

<?php 
if (isset($_FILES['our-file'])) { 
    echo 'You uploaded ' . $_FILES['our-file']['name']; 
    exit(); 
} 
?> 

<!-- 
https://github.com/New-Bamboo/example-ajax-upload 
--> 

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Ajax upload form</title> 
</head> 
<body> 

<form action="index.php" method="post" enctype="multipart/form-data" id="form-id"> 

<p><input id="file-id" type="file" name="our-file" /> 
<input type="submit" value="Submit" /></p> 

<script> 
var form = document.getElementById('form-id'); 
form.onsubmit = function() { 
    var formData = new FormData(form); 
    var action = form.getAttribute('action'); 
    sendXHRequest(formData, action); 
    return false; 
} 

function sendXHRequest(formData, uri) { 
    try { 
    var xhr = new XMLHttpRequest(); 
    xhr.addEventListener('readystatechange', evtXHR , false); 
    xhr.addEventListener('timeout', evtXHR , false); 
    xhr.addEventListener('error', evtXHR , false); 
    xhr.open('POST', uri, true); 
    xhr.timeout = 3000; 
    xhr.send(formData); 
    } catch (err) { 
    result.innerHTML = err; 
    } 
} 

function evtXHR (evt) { 
    var status = null; 

    try { 
    status = evt.target.status; 
    } 
    catch(e) { 
    return; 
    } 

    var result = document.getElementById('result'); 
    var msg = result.innerHTML + '<hr>'; 
    if (status == '200' && evt.target.responseText) { 
    msg += '<p>Results from the server:</p><pre>' + evt.target.responseText + '</pre>'; 
    } 
    msg += '<p>XMLHTTPRequest Event ' + evt.type + '<br>'; 
    msg += 'XMLHTTPRequest Status ' + evt.target.status + '<br>'; 
    msg += 'XMLHTTPRequest Readystate ' + evt.target.readyState + '</p>'; 
    result.innerHTML = msg; 
} 
</script> 

<pre id="result"></pre> 

</form> 
</body> 
</html> 

在表單提交(xhr.send())請求死亡,沒有任何一種有用的錯誤的。 Firefox殺死請求並指示它已被中止(從Firebug網絡面板)。 IE同樣殺死控制檯中出現以下錯誤的請求:

XMLHttpRequest: Network Error 0x2efe, Could not complete the operation due to error 00002efe.

谷歌搜索提供的方向很少。少數可能的解釋是too many requests,overlapping requests cancelling each other out或請求超時。這些似乎都沒有關係。 Mozilla有一個note about stopped requests,似乎可能有幫助,但與我的問題沒有直接關係。

只有使用包含文件的POST請求通過AJAX進行提交時,纔會出現問題。提交常規的非AJAX請求可以正常工作。在沒有文件的情況下提交AJAX請求會很好。提交GET請求有效,但嚴重限制了數據大小。將請求提交給HTML文檔而不是PHP腳本似乎解決了這個問題。

在配置非常類似的服務器上,我無法複製問題。但是,我使用兩個不同的域在同一臺服務器上重現了此問題。這個問題可以在兩臺使用各種瀏覽器的客戶端計算機上覆制。

那麼......現在呢?尋找答案或至少提出如何調試問題的建議。

你可以在這裏找到簡單的上傳腳本:http://flora.p2061.org/fileup

+0

你能發佈AJAX代碼嗎? – TheCarver

+0

所有的代碼都被封裝到Filemanager包中。我只是設置了幾個配置選項,這兩個系統之間是相同的。 – BrianS

+0

我知道你可能已經找到了答案。你看過這個嗎? http://stackoverflow.com/questions/14527387/script7002-xmlhttprequest-network-error-0x2ef3-could-not-complete-the-operati – Nate

回答

0

解決後在聊天服務器端的問題 - 可恥重啓動Apache清除問題:/但是對於任何有興趣的transcript is available here。對於有類似問題的人來說,可能(或不是)有用的對話。

+1

重啓?在Linux? [這是不公平的...這不是我的錯!](http://starwars.com/watch/encyclo_its_not_my_fault.html)哦...只要拿我的鍵盤,我不配擁有它。 – BrianS

相關問題