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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:15:40