PHP多文件分目录上传出现Undefined index报错求助
解决双文件上传时的Undefined Index错误
你遇到的错误提示如下:
Notice: Undefined index: file1 in
Notice: Trying to access array offset on value of type null in
Notice: Undefined index: file2 in
Notice: Trying to access array offset on value of type null in
问题根源
你的PHP代码在页面首次加载(未点击提交按钮)时,就直接访问$_FILES["file1"]和$_FILES["file2"],但此时表单还未提交,$_FILES数组里不存在这两个索引,因此触发了未定义索引的警告。另外原代码还存在语法错误和逻辑漏洞。
修正后的完整代码
<!DOCTYPE html> <html> <head> <title>将文件上传至服务器不同目录</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file1" id="file1"> <input type="file" name="file2" id="file2"> <br><br> <input type="submit" name="submit" value="Submit"> </form> </body> </html> <?php if(isset($_POST["submit"])) { $target_dir1 = "Uploads/Profile/"; $target_dir2 = "Uploads/sign/"; $uOk = 1; // 检查目录是否存在,不存在则创建 if (!is_dir($target_dir1)) { mkdir($target_dir1, 0755, true); } if (!is_dir($target_dir2)) { mkdir($target_dir2, 0755, true); } // 处理第一个文件 if(isset($_FILES["file1"]) && $_FILES["file1"]["error"] == UPLOAD_ERR_OK) { $target_file1 = $target_dir1 . basename($_FILES["file1"]["name"]); // 检查文件是否已存在 if (file_exists($target_file1)) { echo "文件 ". basename($_FILES["file1"]["name"]) ." 已存在。<br>"; $uOk = 0; } // 尝试上传 if ($uOk == 1 && move_uploaded_file($_FILES["file1"]["tmp_name"], $target_file1)) { echo "文件 ". basename($_FILES["file1"]["name"]) ." 上传成功。<br>"; } elseif($uOk == 1) { echo "文件 ". basename($_FILES["file1"]["name"]) ." 上传失败。<br>"; } } else { if(isset($_FILES["file1"]) && $_FILES["file1"]["error"] != UPLOAD_ERR_NO_FILE) { echo "第一个文件上传出错。<br>"; $uOk = 0; } } // 处理第二个文件 if(isset($_FILES["file2"]) && $_FILES["file2"]["error"] == UPLOAD_ERR_OK) { $target_file2 = $target_dir2 . basename($_FILES["file2"]["name"]); // 检查文件是否已存在 if (file_exists($target_file2)) { echo "文件 ". basename($_FILES["file2"]["name"]) ." 已存在。<br>"; $uOk = 0; } // 尝试上传 if ($uOk == 1 && move_uploaded_file($_FILES["file2"]["tmp_name"], $target_file2)) { echo "文件 ". basename($_FILES["file2"]["name"]) ." 上传成功。<br>"; } elseif($uOk == 1) { echo "文件 ". basename($_FILES["file2"]["name"]) ." 上传失败。<br>"; } } else { if(isset($_FILES["file2"]) && $_FILES["file2"]["error"] != UPLOAD_ERR_NO_FILE) { echo "第二个文件上传出错。<br>"; $uOk = 0; } } if ($uOk == 0) { echo "部分文件未完成上传。<br>"; } } ?>
关键修复点
- 将文件操作逻辑包裹在表单提交判断内:所有依赖
$_FILES的代码都移到if(isset($_POST["submit"]))内部,确保只有表单提交时才执行,避免页面初始加载时访问不存在的索引。 - 增加文件上传状态检查:通过
$_FILES["file"]["error"] == UPLOAD_ERR_OK判断文件是否成功上传,同时处理用户未选择文件的情况(UPLOAD_ERR_NO_FILE)。 - 修正语法错误:原代码中
file_exists($target_file1 && $target_file2)的括号位置错误,现在改为分别判断每个文件。 - 添加目录创建逻辑:自动创建不存在的上传目录,避免因目录缺失导致上传失败。
- 拆分文件处理逻辑:分别处理两个文件的上传,逻辑更清晰,便于排查单个文件的问题。
内容的提问来源于stack exchange,提问作者dorami
相关产品推荐
相关产品推荐

