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
相关产品推荐
相关产品推荐

