PHP文件上传后$_FILES数组为空的问题求助
$_FILES为空但$_POST能获取文件名的问题 我已经花了好几个小时尝试解决这个问题,但毫无进展,现在尝试上传一个0.5KB的CSV文件。
我的HTML表单代码如下:
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form>
提交表单后,$_FILES数组始终是空的:
var_dump($_FILES); // array(0) { }
但$_POST数组却能接收到CSV文件的名称:
var_dump($_POST); // array(1) { ["file"]=> string(11) "numbers.csv" }
我的php.ini相关配置如下(最后两项已注释):
file_uploads = On upload_max_filesize = 2M max_file_uploads = 20 ;upload_tmp_dir = ;sys_temp_dir = "/tmp"
/var/tmp文件夹的权限信息(供参考):
drwxr-xr-x 8 root root 4096
排查与解决方法
1. 确认表单enctype属性未被篡改
虽然表单里写了enctype="multipart/form-data",但要检查浏览器实际渲染的代码——打开开发者工具的Elements面板,查看最终的表单标签,确保这个属性没有被JS或其他代码意外移除或修改。
2. 验证PHP配置的实际生效值
php.ini的设置可能被局部配置(比如.htaccess、虚拟主机配置)覆盖,或者修改后没重启服务生效。直接在脚本里输出phpinfo()查看实际生效的参数:
phpinfo();
重点关注:
file_uploads必须为Onpost_max_size(这个参数你没提到,但它限制POST请求的总大小,必须大于upload_max_filesize)upload_tmp_dir是否有有效路径,且PHP进程对该路径有读写权限
3. 检查临时目录的实际访问权限
你给出的/var/tmp权限是drwxr-xr-x,理论上所有用户都能读写,但要确认PHP运行的用户(比如www-data、apache)是否真的能访问这个目录。可以手动创建一个测试目录,指定为临时上传目录:
upload_tmp_dir = "/var/www/upload_tmp"
然后设置权限:
chown www-data:www-data /var/www/upload_tmp chmod 755 /var/www/upload_tmp
修改后重启PHP服务再测试。
4. 排查服务器层面的限制
部分服务器(如Nginx)有独立的上传大小限制,或者安全模块(如ModSecurity)会拦截文件上传请求。查看服务器错误日志(比如/var/log/nginx/error.log或/var/log/apache2/error.log),看是否有相关报错信息。
5. 测试最简代码排除干扰
创建一个全新的PHP文件,只保留最基础的表单和输出逻辑,排除其他业务代码的影响:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { var_dump($_FILES); var_dump($_POST); } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form>
运行这个脚本测试,看是否能正常获取$_FILES数据。
内容的提问来源于stack exchange,提问作者Andrew

