AJAX FormData Post - 503 服务不可用
Posted
技术标签:
【中文标题】AJAX FormData Post - 503 服务不可用【英文标题】:AJAX FormData Post - 503 Service Unavailable 【发布时间】:2015-10-12 10:44:33 【问题描述】:我已经对这个问题进行了广泛的搜索,但无济于事,或者我可能错过了这个问题。请把我能做的任何事情转达给我以改进解释。
我有一个“文件”输入,它在 'change' 上使用 Ajax 调用 Php 文件,如下所示:
$(document).on('change', 'input[name="photo"]', function()
var file = this.files[0];
var formData = new FormData();
var user = localStorage.getItem("user");
formData.append('_file', file);
formData.append('_user', user);
$.ajax(
type: "POST",
cache: false,
url: ip + "php/insert_img.php",
data: formData,
contentType: false,
processData: false,
success: function (e)
// do something
,
error: function (jqXHR, textStatus, errorThrown)
alert(textStatus, errorThrown);
);
);
这应该是一个 phonegap 应用程序,我正在使用 Chrome 的 Ripple Emulator 并启用了 Apache Cordova/PhoneGap 平台进行测试。
现在,使用 localhost 时一切正常,并且 PHP 会按应有的方式打印 formData,但是,当我使用上传到服务器的同一个 PHP 文件时(因此 Ajax 上的 'ip' 变量url 选项),那是另一回事。
一段时间后它返回 error 设置,当检查 Chrome 的开发者工具 > 网络选项卡时,我可以看到请求的“状态代码”是:503 服务不可用。 但是,如果我将 data 设置更改为 FormData() 以外的任何设置,它就会起作用。
似乎问题来自服务器设置,但我不知道问题可能是什么。
【问题讨论】:
我的第一个想法是仔细检查网址。正如您提到的ip
已定义,但也许只是将其写出到控制台以确保。将console.log(ip + "php/insert_img.php");
添加到更改功能中,看看会发生什么。
a 503
表示服务器接收请求并有问题处理它。还要检查服务器日志,了解问题的性质。如果您有权访问服务器代码库,请注销请求的详细信息(标头、有效负载、请求类型等...)。
ip 很好,正如我之前提到的,如果我更改数据类型,说 data: someting: value 并使用它,它就可以工作。似乎与我使用的 FormData 构造函数有关。
【参考方案1】:
我在使用 AJAX 时曾多次遇到此问题,所以这是我最初的想法:
是否定义了“ip”? 网址:ip + "php/insert_img.php"
我还发现删除一些额外的 AJAX 选项解决了这个问题。修改代码如下:
$(document).on('change', 'input[name="photo"]', function()
var file = this.files[0];
var formData = new FormData();
var user = localStorage.getItem("user");
formData.append('_file', file);
formData.append('_user', user);
$.ajax(
type: "POST",
url: ip + "php/insert_img.php",
data: formData,
success: function (e)
// do something
,
error: function (jqXHR, textStatus, errorThrown)
alert(textStatus, errorThrown);
);
);
希望这会有所帮助。
--------- 编辑 ----------
经过一番搜索,我相信问题在于您在哪里附加了 _file
和 _user
数据。如果此数据的值是一个数组,则必须对其进行“字符串化”:
formData.append('_file', JSON.stringify(file));
formData.append('_user', JSON.stringify(user));
【讨论】:
感谢您的输入,是的,“ip”被定义为它在日志中正确输出。 contentType 和 processData 是必需的数据类型,我确实删除了缓存选项无济于事。 这几乎可以肯定是web application firewall。检查您的服务器是否正在运行mod_security
。您需要查看mod_security
使用的规则或服务器上运行的任何其他规则,以找到阻止 URL 的规则。 Found here
错误是一样的,但是如果我不使用FormData构造函数'new FormData();'它可以成功并使用其他类型的基本变量。
@Estobia 我在我的答案中添加了一些额外的信息,希望能有所帮助。
谢谢,它们不是数组,但无论如何都试过了,但没有骰子。我设法更改了 php 文件的服务器并解决了部分问题,所以可能与此有关。不幸的是,现在我在 php 的 $_FILES 上有一个空数组,尽管 chrome 的“请求有效负载”输出一切正确。但我猜这将是另一个问题。以上是关于AJAX FormData Post - 503 服务不可用的主要内容,如果未能解决你的问题,请参考以下文章
在 LIVE 服务器上使用 Ajax Post 时出现 503 错误消息怎么办?