PHP无法获取上传附件:$_FILES全局数组为空问题排查
解决PHP文件上传时$_FILES为空的问题
1. 先检查表单的enctype属性
这是新手最容易踩的坑——文件上传表单必须设置enctype="multipart/form-data",否则PHP根本无法解析文件数据,只会把普通表单内容放到$_POST里,$_FILES必然为空。
正确的表单示例:
<form method="POST" action="upload.php" enctype="multipart/form-data"> <input type="file" name="upload_file"> <button type="submit">上传</button> </form>
2. 验证php.ini的其他关键配置
你已经确认file_uploads = On,但还要检查以下几个参数:
upload_max_filesize:设置的单文件最大上传值,比如upload_max_filesize = 2M,如果测试文件超过这个大小,$_FILES会为空post_max_size:这个值必须大于等于upload_max_filesize,比如post_max_size = 8M,否则整个POST请求会被直接丢弃max_file_uploads:允许同时上传的文件数量,默认是20,确认下没被改成0就行
修改php.ini后必须重启web服务器才能生效,执行对应命令:
# 如果你用Apache sudo systemctl restart apache2 # 如果你用Nginx+PHP-FPM sudo systemctl restart nginx sudo systemctl restart php-fpm
3. 确认文件输入框的name属性
确保文件输入框的name属性正确,比如<input type="file" name="my_file">,PHP里就要用$_FILES['my_file']来获取,名字写错的话也会导致$_FILES为空。
4. 用最简代码测试排除干扰
先写最简化的PHP测试代码,排除其他逻辑的影响:
<?php var_dump($_POST); echo "<br>"; var_dump($_FILES); ?>
搭配前面的正确表单,选文件提交后,正常情况下$_FILES里会出现包含name、tmp_name、size等键的数组。
5. 关于后续JS上传的提前注意点
等基础表单上传正常后,用JS(Fetch/XMLHttpRequest)传文件时要注意:
- 必须用
FormData对象包装文件和数据,不能直接发JSON - 不要手动设置
Content-Type,浏览器会自动添加正确的multipart/form-data及边界标识
示例JS代码:
const fileInput = document.querySelector('input[type="file"]'); const formData = new FormData(); formData.append('upload_file', fileInput.files[0]); fetch('upload.php', { method: 'POST', body: formData }) .then(res => res.text()) .then(data => console.log(data)) .catch(err => console.error(err));
内容的提问来源于stack exchange,提问作者Dario Russo
相关产品推荐
相关产品推荐

