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

PHP doesn't get $_FILES when sending form data using Ajax

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

这是我的表格:

<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
        });
    });

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

<?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) {
}

我在这里阅读了几十个问题的答案和许多解决问题的方法,但是 none 解决了问题。

我做错了什么?为什么我只在 php://input 中收到文件,而不是使用 $_FILES?

谢谢!

我建议您更新您正在使用的 jQuery 版本。 live() 已于 5 年前弃用并从源代码中删除,并且 $.ajax().

中数据的序列化和编码方式发生了一些变化

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