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 错误消息怎么办?

未通过 AJAX POST 请求发送大尺寸图像的 base64(作为 FormData 参数)

jQuery 封装Ajax函数FormData对象

能用ajax以POST实现文件上传吗

在 AJAX 上发送嵌套的 FormData

Cakephp FormData Ajax 文件上传