写一个自定义异常类来处理上传过程以及各种错误--1012
程序员文章站
2022-03-11 14:12:36
...
首先写一个html文档,创建一个基本的上传代码
实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="demo2.php" method="post" enctype="multipart/form-data"> <!-- name有值,告诉服务器从哪拿东西 --> <input type="file" name="my_file" id=""> <!-- 创建隐藏域,设置文件允许的最大长度 --> <input type="hidden" name="MAX_FILE_SIZE" value="3145728"> <button>上传</button> </form> </body> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
创建demo2.php,此次课程代码注释写在里面了
实例
<?php namespace _1012; //导入系统异常类 use Exception; //将系统异常类进行自定义,拓展 class k extends Exception {//对错误信息提示符以及错误代码进行自定义 public function __construct($message = "",$code = 0) { parent::__construct($message,$code); } //自定义错误提示信息 public function errorInfo() {// heredoc语法: 用来输出大段的html代码或字符中, 并且中间允许有变量且会解析,用<<<开始,给标识符为ERROR //getMessage返回错误信息 //getCode返回当前错误代码 return <<< "ERROR" <h2> <strong>{$this->getCode()}: </strong> <span style="color: red;">{$this->getMessage()}</span> </h2> ERROR; } } try {//要处理的代码 $fileType = ['jpg', 'jpeg', 'png', 'gif']; //文件大小。$_FILES超全局变量处理文件上传,文件上传的所有数据保存在里面,它是一个二维数组,第一个键保存的是前端name的属性值,用来指定是谁发送过来的文件,第二个键是上传文件的原始名 $fileSize=3145728; //上传到什么位置 $filePath ='/uploads/'; //原始文件名 $fileName = $_FILES['my_file']['name']; //临时文件名,作为上传文件的中转站,暂时保存地,提高文件上传速率,减少出错概率 $tempFile = $_FILES['my_file']['tmp_name']; //2.判断文件是否上传成功,通过超全局变量$_FILES中【error】进行判断。当返回的值是0时,表示成功,大于1就出错。 //获取当前错误代码 $uploadError = $_FILES['my_file']['error']; if($uploadError>0){ switch($uploadError){ case 1: case 2: throw new k('上传文档不允许超过3M', 111);//die('上传文档不允许超过3M'); case 3: throw new k('上传文件不完整', 112);//die('上传文件不完整'); case 4: throw new k('没有文件被上传', 113);//die('没有文件被上传'); default: throw new k('未知错误', 114);//die('未知错误'); } } //3.判断文件类型是否正确,通过拓展名 //利用函数explode()切割文件名,通过一个点.来切割成为两部分,为数组形式 $extension=explode('.',$fileName)[1]; //此时拿到拓展名 if(!in_array($extension,$fileType)){ //die('不允许上传' .$extension. '文件类型'); throw new k('不允许上传'.$extension. '文件类型', 115); } //4.防止同名覆盖,进行重命名 $fileName=date('ymd',time()).md5(mt_rand(1,99)).'.'.$extension; //5.上传文件函数move_uploaded_file();, //判断文件是否上传成功函数is_uploaded_file(); if(is_uploaded_file($tempFile)){ if(move_uploaded_file($tempFile, __DIR__.$filePath.$fileName)) //要上传到临时文件+文件放入的真实地址 { echo '<script>alert("上传成功");history.back();</script>'; }else{ //die('文件无法移动到指定目录, 请检查目录权限'); throw new k('文件无法移动到指定目录, 请检查目录权限', 116); } }else { //die('非法操作'); throw new k('非法操作', 117); } }catch(k $e){ echo $e->errorInfo();//将用户自定义错误信息打印输出 }//错误处理信息放入 ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
效果图