使用Ajax发送表单数据时PHP不会获得$ _FILES

时间:2018-06-14 13:36:35

标签: php jquery ajax upload multipartform-data

我试图在我的网站上创建一个上传元素。我尝试做的是一个上传按钮,当用户从计算机中选择一个文件时,它会立即上传到服务器。

这是我的表格:

<form id="createAlert" name="createAlert" enctype="multipart/form-data" method="POST" action="createAlert.php">
    <input name="title" type="text" class="input-medium" maxlength="36"></input>

    <textarea name="content" rows="7" cols="90" class="input-short" style="font-family: arial; width: 80%; resize: none; height: 250px"></textarea>

    <input name="push" type="checkbox"></input>

    <input enctype="multipart/form-data" name="img" id="img" size="35" type="file"/>

    <input class="submit-gray" type="submit" value="POST ALERT"/>
</form>

以下是我的Javascript代码,该文件将文件作为FormData对象发送到上传页面(upload.php):

    $('#img').live('change', function() {
        var formData = new FormData();
        formData.append('file', $('#img')[0].files[0]);
        $.ajax({
            url : 'upload.php',
            type : 'POST',
            data : formData,
            enctype: 'multipart/form-data',
            success : function(data) {
                console.log(data);
                alert(data);
            },
            cache: false,
            contentType: false,
            processData: false
        });
    });

到目前为止,这么好 - 一切正常。问题在于upload.php文件收到FormData。这是它的代码(它只是一个它还没有上传文件的测试版本):

<?php
print file_get_contents('php://input');
var_dump($_FILES);
var_dump($_POST);

问题是var_dump($_FILES);var_dump($_POST)的输出是两个空数组,而在file_get_contents('php://input')我得到文件数据。

这是输出(我删除了包含上传文件内容的部分......):

------WebKitFormBoundaryw4nmFcISqYuAWQOS
Content-Disposition: form-data; name="file"; filename="Sem Título-1.png"
Content-Type: image/png

//Here is the file I uploaded...

------WebKitFormBoundaryw4nmFcISqYuAWQOS--
array(0) {
}
array(0) {
}

我在这里阅读了几十个问题的答案以及我遇到的问题的许多解决方案,但没有一个能解决问题。

我做错了什么?为什么我只是在php://输入中接收文件但没有使用$_FILES

谢谢!

1 个答案:

答案 0 :(得分:1)

我建议你更新你正在使用的jQuery版本。 5年前,live()已被弃用并从源代码中删除,并且在$.ajax()内对数据的序列化和编码方式进行了一些更改。

您使用的旧版本可能没有这些更新,并且没有以正确的方式将FormData添加到请求中。