为什么此XMLHTTPRequest在转到服务器之前中止

Why is this XMLHTTPRequest aborted before going to the server?

本文关键字:服务器 XMLHTTPRequest 为什么      更新时间:2024-06-27

我维护了一个web应用程序,它将CKeditor与simogeo Filemanager结合使用。在某个时刻(不幸的是,我不确定什么时候),文件上传功能停止了工作。这不是服务器代码问题(至少不是直接的),因为XHR请求从未发送到服务器。除此之外,这个问题很难诊断,因为当请求失败时,我不会从浏览器中获得太多信息。


为了简化调试,我使用了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:网络错误0x2efe,由于错误00002efe而无法完成操作。

谷歌搜索几乎没有提供什么方向。少数可能的解释是请求太多、重叠的请求相互抵消或请求超时。这些似乎都不相关。Mozilla有一个关于已停止请求的说明,这似乎很有帮助,但与我的问题没有直接关系。

只有当使用包含文件的POST请求通过AJAX提交时,才会出现此问题。提交一个常规的非AJAX请求很好。提交一个没有文件的AJAX请求很顺利。提交GET请求是可行的,但这严重限制了数据大小。将请求提交到HTML文档而不是PHP脚本似乎可以解决这个问题。

在配置非常相似的服务器上,我无法复制问题。然而,我已经在同一台服务器上使用两个不同的域复制了这个问题。这个问题可以在使用各种浏览器的两台不同的客户端计算机上复制。

所以。。。现在怎么办?寻找如何调试问题的答案或至少一个建议。

你可以在这里找到简单的上传脚本:http://flora.p2061.org/fileup

Post在聊天中解决了服务器端问题-可耻地重新启动apache解决了这个问题:/但对于任何感兴趣的人来说,这里都有文字记录。对于任何有类似问题的人来说,可能会有(或不会)有用的对话。