首页 > 解决方案 > 使用 Ajax 发送表单数据时 PHP 没有得到 $_FILES

问题描述

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

这是我的表格:

<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);and的输出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://input 中收到文件但没有使用$_FILES

谢谢!

标签: phpjqueryajaxuploadmultipartform-data

解决方案


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

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


推荐阅读