为什么此XMLHTTPRequest在转到服务器之前中止
Why is this XMLHTTPRequest aborted before going to the server?
我维护了一个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解决了这个问题:/但对于任何感兴趣的人来说,这里都有文字记录。对于任何有类似问题的人来说,可能会有(或不会)有用的对话。
- 使用JSP从服务器检索和显示图像
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 客户端服务器REST API captcha实现
- 正在将base64 jpeg从input-type=file上传到服务器
- Webpack开发服务器和React服务器端渲染
- 提示使用服务器端事件处理程序激活JavaScript
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 如何使用Socket.io将命令从客户端发送到服务器
- jQuery blueimp文件上传:将N-1个文件上传到IE中的服务器
- 使用jasmine模拟对服务器的调用
- 如何轻松地将服务器端变量从Java代码转移到客户端代码
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- 如何使用Javascript将空数组发送到PHP服务器
- 如何在HTML中显示服务器对象变量
- 如何配置分析以将数据发送到我自己的服务器
- 我无法使用angularJs($http)访问服务器
- 如何检测第三方广告服务器请求
- 如何:浏览器将JSON发送到服务器
- 使用node.js服务器中的evernote api获取note内容