PHP8实现文件上传时$_FILES数组为空无返回的问题求助
PHP文件上传$_FILES为空问题原因及解决方案
核心原因
- 表单属性配置错误:你的
<form>标签错误写了两个action属性,将本应定义提交方式的method="post"错写为action="post",导致表单默认使用GET方式提交请求。 - 文件上传必须依赖
POST请求+enctype="multipart/form-data"的配置,GET请求只会将表单参数拼接在URL中(你Apache日志里也能看到是GET请求,参数直接挂在URL后面),不会携带文件二进制内容,因此PHP的$_FILES数组必然为空。
其他代码隐含问题
- $_FILES数组的键是表单中文件控件的
name属性值(也就是你这里的upfile字符串),不是数字索引,现有代码中用for循环按数字下标遍历的逻辑会报错,无法取出文件信息。 - 现有代码中
copy($_FILES["upfile"]["tmp_name"], $info)的逻辑完全无效,$info取的就是临时文件路径,等于把文件复制到本身,没有实际存储意义,且PHP上传文件推荐用更安全的move_uploaded_file函数,可校验文件是否为合法上传的文件。 - 缺少上传错误状态校验,直接判断
size>0可能触发不存在的数组键错误,建议优先判断$_FILES['upfile']['error']是否等于UPLOAD_ERR_OK。
修复步骤
- 修正表单属性,将多余的
action改为method:
<form action="hochladen.php" method="post" enctype="multipart/form-data"> <p> <input name="upfile" type="file"></p> <p> <input type="submit" name="hochladen"></p><br> </form>
- 修正PHP处理逻辑,示例如下:
<?php // 先判断是否为POST提交且有上传文件 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upfile'])) { $uploadFile = $_FILES['upfile']; // 校验上传是否成功 if ($uploadFile['error'] === UPLOAD_ERR_OK) { // 自定义存储路径,需提前创建upload目录并赋予写入权限 $savePath = __DIR__ . '/upload/' . basename($uploadFile['name']); // 移动临时文件到目标存储路径 if (move_uploaded_file($uploadFile['tmp_name'], $savePath)) { echo "文件上传成功,存储路径:" . $savePath; } else { echo "文件存储失败,请检查目录权限"; } } else { echo "上传出错,错误码:" . $uploadFile['error']; } } ?>
内容的提问来源于stack exchange,提问作者Michael Konz
相关产品推荐
相关产品推荐

