HTML文件输入实现多文件上传时PHP报错问题排查
多文件上传报错「Uploaded data error」解决方案
问题背景
单文件上传功能正常,给input的name属性添加[]并开启multiple切换为多文件上传后,后端PHP返回「Uploaded data error」错误。
核心错误原因
多文件上传时,PHP的$_FILES会变成二维数组结构:每个文件的name、tmp_name、error等属性都是数组形式。而原有代码仍按单文件的一维数组逻辑处理,比如直接判断$_FILES["uploadedFile"]['error'] != 0——此时error是一个数组,和0直接比较会导致逻辑错误,触发报错。
修正后的代码实现
后端upload.php(关键修改)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <?php if ($_SERVER['REQUEST_METHOD'] !== 'POST') { echo "请选择文件后再提交"; die; } // 验证多文件上传的数组结构 if (!isset($_FILES["uploadedFile"]) || !is_array($_FILES["uploadedFile"]['name'])) { echo "数据结构错误"; die; } $target_dir = "uploads/"; $maxfilesize = 80000000; $allowtypes = array('jpg', 'png', 'jpeg', 'gif'); $uploadResults = []; // 循环处理每个上传文件 $totalFiles = count($_FILES['uploadedFile']['name']); for ($i = 0; $i < $totalFiles; $i++) { $allowUpload = true; $currentFileName = basename($_FILES["uploadedFile"]["name"][$i]); $currentFileError = $_FILES["uploadedFile"]['error'][$i]; // 跳过上传出错的文件 if ($currentFileError !== 0) { $uploadResults[] = "文件「$currentFileName」上传错误,错误码:$currentFileError"; continue; } $target_file = $target_dir . $currentFileName; $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION)); // 图片验证(按需保留) if (isset($_POST["submit"])) { $check = getimagesize($_FILES["uploadedFile"]["tmp_name"][$i]); if ($check === false) { $uploadResults[] = "文件「$currentFileName」不是有效的图片文件"; $allowUpload = false; } } // 文件存在校验 if (file_exists($target_file)) { require "other/fileExsist.php"; $uploadResults[] = "文件「$currentFileName」已存在"; $allowUpload = false; } // 文件大小校验 if ($_FILES["uploadedFile"]["size"][$i] > $maxfilesize) { require "other/fileSize.php"; $uploadResults[] = "文件「$currentFileName」超出大小限制"; $allowUpload = false; } // 文件类型校验 if (!in_array($imageFileType, $allowtypes)) { require "other/fileExtenstion.php"; $uploadResults[] = "文件「$currentFileName」格式不支持,仅允许jpg/png/jpeg/gif"; $allowUpload = false; } // 执行上传操作 if ($allowUpload) { if (move_uploaded_file($_FILES["uploadedFile"]["tmp_name"][$i], $target_file)) { $uploadResults[] = "文件「$currentFileName」上传成功"; // 成功后可调用prepare.php处理后续逻辑 // require "prepare.php"; } else { $uploadResults[] = "文件「$currentFileName」上传失败"; } } } // 输出所有上传结果 foreach ($uploadResults as $result) { echo $result . "<br>"; } ?>
额外注意事项
- 路径分隔符:PHP中统一使用正斜杠
/,避免Windows反斜杠\带来的转义问题(比如require "other/fileExsist.php")。 - 前端代码:HTML和JavaScript部分无需修改,当前逻辑可正常触发多文件上传。
- 错误处理:新增了循环遍历每个文件的错误处理,能清晰反馈每个文件的上传状态。
内容的提问来源于stack exchange,提问作者MrObscure
相关产品推荐
相关产品推荐

