【问题标题】:PHP doesn't get $_FILES when sending form data using Ajax使用 Ajax 发送表单数据时 PHP 没有得到 $_FILES
【发布时间】:2018-06-14 13:36:34
【问题描述】:

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

这是我的表格:

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

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

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

谢谢!

【问题讨论】:

  • 您使用的 jQuery 版本是多少?我问live() 已在很久 之前被弃用并删除
  • @RoryMcCrossan 现在我正在使用 jquery 1.3.2 这是一个旧系统,我刚刚升级它添加新功能,我可以更新它但我认为它不会导致这个问题……是吗?
  • 这肯定不会有帮助。那个版本的 jQuery 已经过时了将近 10 年。
  • @RoryMcCrossan 天才!有效!我不敢相信是这样,我在这个愚蠢的事情上花了 5 个小时,哈哈。将其发布为答案;)
  • 很高兴它对你有用。我将其添加为答案。

标签: php jquery ajax upload multipartform-data


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-01
    • 2014-12-19
    • 2014-01-23
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多