PHP如何验证多文件上传时$_FILES['file']['error']数组全为0?
多文件上传添加上传错误校验的实现
要在上传代码执行前校验所有文件的上传错误码,你可以通过以下步骤实现:
校验逻辑说明
$_FILES['file']['error']是存储每个文件上传错误码的数组,错误码为0(对应常量UPLOAD_ERR_OK)表示上传无异常。我们需要确认数组中所有值都为0,才能继续执行后续的文件移动和数据库存储操作。
修改后的完整代码
下面是添加了错误校验逻辑的完整代码,标注的部分为新增内容:
if(isset($_POST['submit'])) { $allowed = array('jpg','jpeg','png','pdf','xlsx','docs','xls','docx','ppt'); $file_name_checking = $_FILES['file']['name']; $file_size_checking = $_FILES['file']['size']; $file_error_checking = $_FILES['file']['error']; //this is the array to be checked $file_name_check_actual_ext = array(); foreach ($file_name_checking as $extension_files) { $extension_actual = explode('.', $extension_files); $file_actual_Ext = strtolower(end($extension_actual)); $file_name_check_actual_ext[] = $file_actual_Ext; } $file_name_check_ext = !array_diff($file_name_check_actual_ext, $allowed); if($file_name_check_ext === true) { if(max($file_size_checking) < 1000000) { // --- 新增:上传错误校验逻辑 --- $has_upload_error = false; foreach($file_error_checking as $error_code) { if($error_code !== UPLOAD_ERR_OK) { $has_upload_error = true; break; } } if($has_upload_error) { echo "部分文件上传出现错误,请重新尝试!"; } else { // --- 新增结束 --- //my upload code $all_upload_success = true; // 新增:标记所有文件是否上传成功 foreach ($_FILES['file']['tmp_name'] as $key => $value) { $file_name = $_FILES['file']['name'][$key]; $file_tmp_name = $_FILES['file']['tmp_name'][$key]; $file_size = $_FILES['file']['size'][$key]; $file_error = $_FILES['file']['error'][$key]; $file_type = $_FILES['file']['type'][$key]; $file_ext = explode('.', $file_name); $file_name_original = pathinfo($file_name, PATHINFO_FILENAME); $file_actual_Ext = strtolower(end($file_ext)); $file_name_new = uniqid('',true).".".$file_actual_Ext; $file_destination = '../uploads/'.$file_name_new; $result = move_uploaded_file($file_tmp_name, $file_destination); if(!$result) { $all_upload_success = false; } $query = "INSERT INTO file_storage ( file_name, file_size, file_type, file_name_unique, file_ext ) VALUES ( :file_name, :file_size, :file_type, :file_name_unique, :file_ext ) "; $stmt=$pdo->prepare($query); $stmt->bindParam(":file_name", $file_name_original); $stmt->bindParam(":file_size", $file_size); $stmt->bindParam(":file_type", $file_type); $stmt->bindParam(":file_name_unique", $file_name_new); $stmt->bindParam(":file_ext", $file_actual_Ext); $stmt->execute(); } if ($all_upload_success) { echo "Files uploaded successfully!"; } else { echo "部分文件上传失败,请检查!"; } } // --- 新增:闭合错误校验的else分支 --- } else { echo "File Size is too large!"; } } else { echo "Please check the extension of files"; } }
补充说明
- 新增的错误校验逻辑遍历
$file_error_checking数组,只要发现任意一个文件的错误码不为UPLOAD_ERR_OK,就标记存在上传错误,终止后续上传操作 - 同时优化了原代码中
$result的判断逻辑:原代码只判断最后一个文件的上传结果,改为用$all_upload_success标记所有文件是否都上传成功,结果更准确
内容的提问来源于stack exchange,提问作者newbie coder
相关产品推荐
相关产品推荐

