我維護一個使用CKeditor與simogeo 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
你能發佈AJAX代碼嗎? – TheCarver
所有的代碼都被封裝到Filemanager包中。我只是設置了幾個配置選項,這兩個系統之間是相同的。 – BrianS
我知道你可能已經找到了答案。你看過這個嗎? http://stackoverflow.com/questions/14527387/script7002-xmlhttprequest-network-error-0x2ef3-could-not-complete-the-operati – Nate