You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX提交FormData上传文件时PHP端$_FILES返回空数组求助

解决FormData上传文件时PHP $_FILES为空的问题

我帮你排查出几个关键问题,修改后就能正常接收文件啦:

1. 请求头设置错误,FormData发送方式有误

你在JS里手动设置了Content-type: application/x-www-form-urlencoded,但上传文件需要的是multipart/form-data类型,而且绝对不要手动设置这个请求头——当你用XMLHttpRequest发送FormData对象时,浏览器会自动帮你生成正确的Content-Type(包括用于分隔文件的boundary标识),手动设置反而会破坏文件上传的格式。

另外,你用xhttp.send('upload='+formData)这种方式拼接FormData是完全错误的,FormData是特殊的二进制对象,不能直接转成字符串拼接,应该直接发送FormData本身。

2. FormData键名与PHP接收的对应问题

你在JS里把文件append到files[]键下,但PHP里仅判断$_POST['upload']是否存在,不过这不是核心问题,核心还是发送方式错误。

修改后的JavaScript代码

document.getElementById("quoteform").addEventListener("submit", function(event){
    var files = document.getElementById("quote").files;
    var formData = new FormData();
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        formData.append('uploadfile[]', file); // 可以用和input name一致的键,也可以保持files[]
    }
    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", "linktophpfile.php", true);
    // 移除手动设置Content-Type的代码!!
    xhttp.send(formData); // 直接发送FormData对象
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            alert(this.responseText);
        }
    }
    event.preventDefault();
});

修改后的PHP代码(可选优化)

如果JS里用uploadfile[]作为键,PHP可以直接打印$_FILES,不需要依赖$_POST['upload'],因为文件上传信息本身就存在$_FILES数组中:

<?php
print_r($_FILES);
// 若要判断是否有文件上传,可补充:
if(!empty($_FILES['uploadfile'])){
    print_r($_FILES['uploadfile']);
}
?>

额外注意点

  • 确保PHP配置里的upload_max_filesize和post_max_size参数值足够大,避免因文件大小超出限制导致接收失败。
  • 表单最好加上enctype="multipart/form-data",虽然AJAX上传时不是必须,但更规范:
<form method="post" id="quoteform" enctype="multipart/form-data">
    <input type="file" name="uploadfile" id="quote"/>
    <input type="submit" value="upload"/>
</form>

内容的提问来源于stack exchange,提问作者Jan Bloemkool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:43:13