PHP表单文件上传时 `$_files` 数组为空,通常是因表单字段名与 php 中访问键名不匹配、缺少 `enctype` 属性或未正确检查上传状态所致;本文详解错误根源、修复方法及健壮验证实践。
在 PHP 文件上传开发中,一个高频却易被忽视的错误是:表单提交后 $_FILES 数组看似存在,但实际为空或触发“Undefined index”警告——这往往并非服务器配置问题(如 file_uploads = On),而是客户端表单与服务端访问逻辑不一致导致。
你 HTML 中的文件输入字段定义为:
<input type="file" name="pimg[]" multiple>
这意味着:
✅ 表单提交后,PHP 会将该字段数据存入 $_FILES['pimg'](键名为 pimg);
❌ 而你的 PHP 代码却错误地尝试访问 $_FILES['file']['pimg'] —— 这个嵌套结构根本不存在,属于凭空索引,必然报错或返回空值。
此外,$_FILES['pimg'] 是一个二维数组(因含 name、type、size、tmp_name、error 五个子键),且当使用 multiple 时,name 和 size 等均为索引数组(如 $_FILES['pimg']['name'][0])。直接对 $_FILES['pimg'] 使用 empty() 判断极易误判:即使用户未选文件,$_FILES['pimg']['name'] 仍可能为非空数组(含空字符串),而 $_FILES['pimg']['size'] 才是判断是否真实上传的关键依据。
修正后的完整示例(HTML + PHP):
HTML 表单(确保 enctype 和 name 准确):
<form method="POST" action="../php/post.php" enctype="multipart/form-data">
<h3>Title</h3>
<input type="hidden" name="case" value="1">
<input type="text" name="pname" placeholder="Post title">
<h3>Message</h3>
<input type="text" name="pmsg" placeholder="Your message">
<h3>Images</h3>
<input type="file" name="pimg[]" multiple>
<input class="submit" type="submit" value="Upload">
</form>
PHP 处理逻辑(安全、健壮):
<?php
// 检查是否为 POST 请求且存在文件字段
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['pimg'])) {
$files = $_FILES['pimg'];
// 正确判断:检查第一个文件的 size 是否 > 0(注意:size=0 表示未选择文件)
if ($files['size'][0] > 0) {
$noFiles = 1;
echo "Files found...\n";
// 示例:遍历所有上传文件
foreach ($files['name'] as $index => $filename) {
if ($files['error'][$index] === UPLOAD_ERR_OK) {
echo "File {$index}: {$filename} ({$files['size'][$index]} bytes)\n";
}
}
} else {
$noFiles = 0;
echo "Files not found — please select at least one file.\n";
}
} else {
echo "No file data received. Check form enctype and submission method.\n";
}
?>
遵循以上规范,即可彻底规避 $_FILES “看似存在却为空”的陷阱,让文件上传逻辑稳定、可维护、符合 PHP 最佳实践。
Copyright 2026 荣飞网 All Rights Reserved 苏ICP备17039739号-1