批改状态:合格
老师批语:这里面涉及的知识点很多
自定义异常类来处理上传过程
自定义 Exception; //系统错误处理类 返回信息;
设计一个exception的 子类 通过 __construct 构造方法传递参数 自定义错误信息
自定义一个 错误信息,返回方法 errorInfo() 进行调用
也可以 直接输出 自定义错误信息;
使用,throw 新建 子类对象 throw new CalException(参数1,参数2); 并传递错误返回信息
通过try { 代码体,可以用引用 }catch (CalException $e) { echo 调用错误方法 $e->errorInfo() }
实例如下:
<?php
// use Exception; //系统错误处理类
$fileType = ['jpg', 'jpeg', 'png', 'gif']; //上传文件类别限制
$fileSize = 1024856; //上传文件大小限制
$filePath = '/uploads/'; //上传目录
$fileName = $_FILES['my_file']['name']; // 上传文件名
$tempFile = $_FILES['my_file']['tmp_name']; //临时文件名
// 将系统的异常类进行扩展,自定义
class CalException extends Exception
{
public function __construct($message = "", $code = 0)
{
parent::__construct($message, $code); //继承父类构造方法 并指定参数
}
// 自定义错误提示信息
public function errorInfo()
{
// <<< "ERROR" ERROR; 用来输出大量的html代码或字符, 并且中间允许有变量且会解析
// $this->getCode() $this->getMessage() 错误类自带属性,构造方法进行赋值 返回的错误格式内容
return <<< "ERROR"
<h3>
<strong>{$this->getCode()}: </strong>
<p style="color: red;">{$this->getMessage()}</p>
</h3>
ERROR;
}
}
try {
// 2. 判断文件是否上传成功?
//$_FILES['my_file']['error'], 0: 表示成功,大于1出错
$uploadError = $_FILES['my_file']['error'];
if ($uploadError > 0) {
switch ($uploadError) {
case 1: throw new CalException('文件超过最大限制', 101); // 向系统错误类传递参数
case 2: throw new CalException('文件超过限制,上传文件不应大于1M', 102);
case 3: throw new CalException('文件不完整', 103);
case 4: throw new CalException('没有发现文件', 104);
default: throw new CalException('未知错误', 105);
}
}
// 3. 判断文件扩展名是否正确?
$extension = explode('.', $fileName); // 用 . 分割文件名后的
$extension = end($extension); // 取最后一组 值 即上传文件的扩展名
if (!in_array($extension, $fileType)) {
throw new CalException('文件类型错误'.$extension.'格式受限', 106);
}
// 4. 为了防止同名覆盖, 将上传的文件重命名: md5+时间戳
$fileName = date('YmdHis',time()).md5(mt_rand(1,99)). '.' . $extension;
// 5. 上传文件
if (is_uploaded_file($tempFile)) {
if (move_uploaded_file($tempFile, __DIR__. $filePath.$fileName)){
echo '<script>alert("上传成功");history.back();</script>';
} else {
throw new CalException('文件无法保存,上传目录受限', 107);
}
} else {
throw new CalException('非法操作', 108);
}
exit();
} catch (CalException $e) {
echo $e->errorInfo(); //根据系统错误类 接收的值 输出错误
echo '<br>';
echo '<h3><strong>'.$e->getCode().'</strong><p style="color: red;">'.$e->getMessage().'</p></h3>';
}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号