Javascript 为什么在转到服务器之前中止此XMLHTTPRequest?
我维护了一个web应用程序,该应用程序与一起使用。在某个时候(不幸的是,我不确定何时),文件上传功能停止工作。这不是服务器代码问题(至少不是直接问题),因为XHR请求从未发送到服务器。不过,除此之外,这个问题很难诊断,因为当请求失败时,我无法从浏览器中获取太多信息Javascript 为什么在转到服务器之前中止此XMLHTTPRequest?,javascript,php,jquery,ajax,debugging,Javascript,Php,Jquery,Ajax,Debugging,我维护了一个web应用程序,该应用程序与一起使用。在某个时候(不幸的是,我不确定何时),文件上传功能停止工作。这不是服务器代码问题(至少不是直接问题),因为XHR请求从未发送到服务器。不过,除此之外,这个问题很难诊断,因为当请求失败时,我无法从浏览器中获取太多信息 为了简化调试,我使用了修改后的AJAX文件上载示例,如下所示: Ajax上传表单 var form=document.getElementById('form-id'); form.onsubmit=函数(){ var for
为了简化调试,我使用了修改后的AJAX文件上载示例,如下所示:
Ajax上传表单
var form=document.getElementById('form-id');
form.onsubmit=函数(){
var formData=新formData(表格);
var action=form.getAttribute('action');
发送请求(表单数据、操作);
返回false;
}
函数sendXHRequest(formData,uri){
试一试{
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);
}捕捉(错误){
result.innerHTML=err;
}
}
函数evtXHR(evt){
var状态=空;
试一试{
状态=evt.target.status;
}
捕获(e){
返回;
}
var result=document.getElementById('result');
var msg=result.innerHTML+“
”;
如果(状态='200'&&evt.target.responseText){
msg+='来自服务器的结果:'+evt.target.responseText+'';
}
msg+='XMLHTTPRequest事件'+evt.type+'
';
msg+=“XMLHTTPRequest Status”+evt.target.Status+”
;
msg+=“XMLHTTPRequest Readystate”+evt.target.Readystate+”;
result.innerHTML=msg;
}
表单提交(xhr.send()
)后,请求将终止,不会出现任何有用的错误。Firefox会终止请求并表示请求已被中止(从Firebug网络面板)。IE同样会在控制台中以以下错误终止请求:
XMLHttpRequest:网络错误0x2efe,由于错误00002efe,无法完成操作
谷歌在方向上几乎没有提供什么帮助。少数可能的解释是,或请求超时。这些似乎都不相关。Mozilla有一个可能有用的解决方案,但与我的问题没有直接关系
只有在使用包含文件的POST请求通过AJAX提交时,才会出现此问题。提交一个常规的、非AJAX的请求很好。在没有文件的情况下提交AJAX请求很顺利。提交GET请求是可行的,但这严重限制了数据大小。将请求提交到HTML文档而不是PHP脚本似乎可以解决这个问题
在配置非常相似的服务器上,我无法复制该问题。然而,我在同一台服务器上使用两个不同的域复制了这个问题。这个问题可以在两台使用不同浏览器的不同客户端计算机上复制
所以。。。现在怎么办?寻找一个答案或者至少是一个如何调试问题的建议
您可以在这里找到简单的上传脚本:在聊天中作为服务器端问题解决后-可耻地重新启动apache清除了问题:/但是对于任何感兴趣的人来说。对于任何有类似问题的人来说,可能会有(或没有)有用的对话。您能发布AJAX代码吗?所有代码都打包到Filemanager包中。我只是设置了一些配置选项,它们在两个系统之间是相同的。我知道您可能已经搜索了答案。你看过这个吗?我做到了(有一次我找到了AJAX配置对象的设置位置)。它导致Firefox抛出一个JS错误:
TypeError:b为null
。另外,需要注意的是,只有在上传文件时才会出现这种情况。普通表单数据通过AJAX发布很好。重启吗?在linux中?哦拿着我的键盘,我再也配不上它了。
<?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>