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

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必须为On
  • post_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:03:35