|
1.结合异常的使用
- <?php
- // 文件上传类
- class Uploads
- {
- // 文件上传的信息
- protected $files = [];
- // 上传配置
- protected $config = [
- // 默认限定大小,为0表示不限制
- 'allowSize' => 0,
- // 默认限定类型,为空表示不限制
- 'allowType' => [],
- // 上传文件保存的目录
- 'uploadDir' => './upload/',
- ];
- // 随机名字的存储
- protected $fileName = '';
- // 文件的拓展名
- protected $ext = '';
- // 构造方法
- public function __construct(string $field, array $config = [])
- {
- // 保证存在字段
- if (!isset($_FILES[$field])) {
- throw new \Exception('上传文件的信息不存在!');
- }
- // 获取上传文件的信息
- $this->files = $_FILES[$field];
- // 合并配置
- $this->config = array_merge($this->config, $config);
- // 创建保存目录
- $this->makedir();
- }
- // 创建保存目录
- protected function makeDir()
- {
- // 处理保存文件的路径
- $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';
- // 确保这个路径存在
- if (!file_exists($this->config['uploadDir'])) {
- if (!mkdir($this->config['uploadDir'], 0777, true)) {
- throw new \Exception('创建保存目录失败,请检查权限问题!');
- }
- }
- }
- // 错误判断
- protected function checkError()
- {
- // 1. 确保文件上传的正确
- if ($this->files['error'] != 0)
- {
- // echo '上传错误';
- throw new \Exception('上传错误,错误号码:' . $this->files['error']);
- }
-
- // 返回对象本身
- return $this;
- }
- // 判断大小
- protected function checkSize()
- {
- // 2. 限定大小
- if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
- // echo '超出大小';
- throw new \Exception('超出大小,限定大小为:' . $this->config['allowSize']);
- }
- // 返回对象本身
- return $this;
- }
- // 判断类型
- protected function checkType()
- {
- $allowType = $this->config['allowType'];
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
- // echo '类型不允许';
- throw new \Exception('类型不允许,请检查配置文件!');
- }
- // 返回对象本身
- return $this;
- }
- // 判断合法性
- protected function isUploadFile()
- {
- // 4. 判断是否合法上传
- if (!is_uploaded_file($this->files['tmp_name'])) {
- throw new \Exception('非法上传!');
- }
- // 返回对象本身
- return $this;
- }
- // 生成随机名字
- protected function makeFileName()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- // 返回对象本身
- return $this;
- }
- // 获取拓展名
- protected function extension()
- {
- // 获取拓展名
- $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
- // 返回对象本身
- return $this;
- }
- // 执行上传
- public function uploadFile()
- {
- // 链式调用
- $this->checkError()->checkSize()->checkType()->isUploadFile()->makeFileName()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \Exception('执行失败,未知错误!');
- }
- return true;
- }
- }
- class uploadNew extends Uploads
- {
- // 执行上传
- public function uploadFile()
- {
- // 链式调用
- $this->checkError()->isUploadFile()->makeFileName()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \Exception('执行失败,未知错误!');
- }
- return true;
- }
- }
- try {
- $config = [
- // 'allowSize' => 20,
- ];
- $upload = new uploadNew('image', $config);
- $result = $upload->uploadFile();
- var_dump($result);
- } catch(Exception $e) {
- // 日志记录的操作
- echo $e->getMessage() . '<br>';
- // echo $e->getCode() . '<br>';
- // echo $e->getFile() . '<br>';
- // echo $e->getLine() . '<br>';
- }
复制代码 2、容易拓展
- <?php
- // 文件上传类
- class Uploads
- {
- // 文件上传的信息
- protected $files = [];
- // 上传配置
- protected $config = [
- // 默认限定大小,为0表示不限制
- 'allowSize' => 0,
- // 默认限定类型,为空表示不限制
- 'allowType' => [],
- // 上传文件保存的目录
- 'uploadDir' => './upload/',
- ];
- // 随机名字的存储
- protected $fileName = '';
- // 文件的拓展名
- protected $ext = '';
- // 构造方法
- public function __construct(string $field, array $config = [])
- {
- // 保证存在字段
- if (!isset($_FILES[$field])) {
- throw new \Exception('上传文件的信息不存在!');
- }
- // 获取上传文件的信息
- $this->files = $_FILES[$field];
- // 合并配置
- $this->config = array_merge($this->config, $config);
- // 创建保存目录
- $this->makedir();
- }
- // 创建保存目录
- protected function makeDir()
- {
- // 处理保存文件的路径
- $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';
- // 确保这个路径存在
- if (!file_exists($this->config['uploadDir'])) {
- if (!mkdir($this->config['uploadDir'], 0777, true)) {
- throw new \Exception('创建保存目录失败,请检查权限问题!');
- }
- }
- }
- // 错误判断
- protected function checkError()
- {
- // 1. 确保文件上传的正确
- if ($this->files['error'] != 0)
- {
- // echo '上传错误';
- throw new \Exception('上传错误,错误号码:' . $this->files['error']);
- }
-
- // 返回对象本身
- return $this;
- }
- // 判断大小
- protected function checkSize()
- {
- // 2. 限定大小
- if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
- // echo '超出大小';
- throw new \Exception('超出大小,限定大小为:' . $this->config['allowSize']);
- }
- // 返回对象本身
- return $this;
- }
- // 判断类型
- protected function checkType()
- {
- $allowType = $this->config['allowType'];
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
- // echo '类型不允许';
- throw new \Exception('类型不允许,请检查配置文件!');
- }
- // 返回对象本身
- return $this;
- }
- // 判断合法性
- protected function isUploadFile()
- {
- // 4. 判断是否合法上传
- if (!is_uploaded_file($this->files['tmp_name'])) {
- throw new \Exception('非法上传!');
- }
- // 返回对象本身
- return $this;
- }
- // 生成随机名字
- protected function makeFileName()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- // 返回对象本身
- return $this;
- }
-
- protected function makeFileNameV2()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid()) . md5(time());
- // 返回对象本身
- return $this;
- }
- // 获取拓展名
- protected function extension()
- {
- // 获取拓展名
- $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
- // 返回对象本身
- return $this;
- }
- // 执行上传
- public function uploadFile()
- {
- // 链式调用
- $this->checkError()->checkSize()->checkType()->isUploadFile()->makeFileName()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \Exception('执行失败,未知错误!');
- }
- return true;
- }
- public function uploadFilev2()
- {
- // 链式调用
- $this->checkError()->checkSize()->checkType()->isUploadFile()->makeFileNamev2()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \Exception('执行失败,未知错误!');
- }
- return true;
- }
- public function getFileName()
- {
- return $this->fileName;
- }
- }
- try {
- $config = [
- // 'allowSize' => 20,
- ];
- $upload = new Uploads('image', $config);
- $result = $upload->uploadFilev2();
- echo $upload->getFileName();
- var_dump($result);
- } catch(Exception $e) {
- // 日志记录的操作
- echo $e->getMessage() . '<br>';
- // echo $e->getCode() . '<br>';
- // echo $e->getFile() . '<br>';
- // echo $e->getLine() . '<br>';
- }
复制代码 3.继承基类
- <?php
- class UploadsException extends \Exception
- {
- }
- // 文件上传类
- class Uploads
- {
- // 文件上传的信息
- protected $files = [];
- // 上传配置
- protected $config = [
- // 默认限定大小,为0表示不限制
- 'allowSize' => 0,
- // 默认限定类型,为空表示不限制
- 'allowType' => [],
- // 上传文件保存的目录
- 'uploadDir' => './upload/',
- ];
- // 随机名字的存储
- protected $fileName = '';
- // 文件的拓展名
- protected $ext = '';
- // 构造方法
- public function __construct(string $field, array $config = [])
- {
- // 保证存在字段
- if (!isset($_FILES[$field])) {
- throw new \UploadsException('上传文件的信息不存在!');
- }
- // 获取上传文件的信息
- $this->files = $_FILES[$field];
- // 合并配置
- $this->config = array_merge($this->config, $config);
- // 创建保存目录
- $this->makedir();
- }
- // 创建保存目录
- protected function makeDir()
- {
- // 处理保存文件的路径
- $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';
- // 确保这个路径存在
- if (!file_exists($this->config['uploadDir'])) {
- if (!mkdir($this->config['uploadDir'], 0777, true)) {
- throw new \UploadsException('创建保存目录失败,请检查权限问题!');
- }
- }
- }
- // 错误判断
- protected function checkError()
- {
- // 1. 确保文件上传的正确
- if ($this->files['error'] != 0)
- {
- // echo '上传错误';
- throw new \UploadsException('上传错误,错误号码:' . $this->files['error']);
- }
-
- // 返回对象本身
- return $this;
- }
- // 判断大小
- protected function checkSize()
- {
- // 2. 限定大小
- if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
- // echo '超出大小';
- throw new \UploadsException('超出大小,限定大小为:' . $this->config['allowSize']);
- }
- // 返回对象本身
- return $this;
- }
- // 判断类型
- protected function checkType()
- {
- $allowType = $this->config['allowType'];
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
- // echo '类型不允许';
- throw new \UploadsException('类型不允许,请检查配置文件!');
- }
- // 返回对象本身
- return $this;
- }
- // 判断合法性
- protected function isUploadFile()
- {
- // 4. 判断是否合法上传
- if (!is_uploaded_file($this->files['tmp_name'])) {
- throw new \UploadsException('非法上传!');
- }
- // 返回对象本身
- return $this;
- }
- // 生成随机名字
- protected function makeFileName()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- // 返回对象本身
- return $this;
- }
- // 获取拓展名
- protected function extension()
- {
- // 获取拓展名
- $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
- // 返回对象本身
- return $this;
- }
- // 执行上传
- public function uploadFile()
- {
- // 链式调用
- $this->checkError()->checkSize()->checkType()->isUploadFile()->makeFileName()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \UploadsException('执行失败,未知错误!');
- }
- return true;
- }
- // 获取名字
- public function getFileName()
- {
- return $this->fileName;
- }
- }
- try {
- $config = [
- 'allowSize' => 20,
- ];
- $upload = new Uploads('image', $config);
- $result = $upload->uploadFile();
- var_dump($result);
- } catch(UploadsException $e) {
- echo '<pre>';
- print_r($e);
- echo '</pre>';
- // 日志记录的操作
- echo $e->getMessage() . '<br>';
- // echo $e->getCode() . '<br>';
- // echo $e->getFile() . '<br>';
- // echo $e->getLine() . '<br>';
- }
复制代码 4.多层catch
- <?php
- class UploadsException extends \Exception
- {
- }
- // 文件上传类
- class Uploads
- {
- // 文件上传的信息
- protected $files = [];
- // 上传配置
- protected $config = [
- // 默认限定大小,为0表示不限制
- 'allowSize' => 0,
- // 默认限定类型,为空表示不限制
- 'allowType' => [],
- // 上传文件保存的目录
- 'uploadDir' => './upload/',
- ];
- // 随机名字的存储
- protected $fileName = '';
- // 文件的拓展名
- protected $ext = '';
- // 构造方法
- public function __construct(string $field, array $config = [])
- {
- // 保证存在字段
- if (!isset($_FILES[$field])) {
- throw new \UploadsException('上传文件的信息不存在!');
- }
- // 获取上传文件的信息
- $this->files = $_FILES[$field];
- // 合并配置
- $this->config = array_merge($this->config, $config);
- // 创建保存目录
- $this->makedir();
- }
- // 创建保存目录
- protected function makeDir()
- {
- // 处理保存文件的路径
- $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';
- // 确保这个路径存在
- if (!file_exists($this->config['uploadDir'])) {
- if (!mkdir($this->config['uploadDir'], 0777, true)) {
- throw new \UploadsException('创建保存目录失败,请检查权限问题!');
- }
- }
- }
- // 错误判断
- protected function checkError()
- {
- // 1. 确保文件上传的正确
- if ($this->files['error'] != 0)
- {
- // echo '上传错误';
- throw new \UploadsException('上传错误,错误号码:' . $this->files['error']);
- }
-
- // 返回对象本身
- return $this;
- }
- // 判断大小
- protected function checkSize()
- {
- // 2. 限定大小
- if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
- // echo '超出大小';
- throw new \UploadsException('超出大小,限定大小为:' . $this->config['allowSize']);
- }
- // 返回对象本身
- return $this;
- }
- // 判断类型
- protected function checkType()
- {
- $allowType = $this->config['allowType'];
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
- // echo '类型不允许';
- throw new \UploadsException('类型不允许,请检查配置文件!');
- }
- // 返回对象本身
- return $this;
- }
- // 判断合法性
- protected function isUploadFile()
- {
- // 4. 判断是否合法上传
- if (!is_uploaded_file($this->files['tmp_name'])) {
- throw new \UploadsException('非法上传!');
- }
- // 返回对象本身
- return $this;
- }
- // 生成随机名字
- protected function makeFileName()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- // 返回对象本身
- return $this;
- }
- // 获取拓展名
- protected function extension()
- {
- // 获取拓展名
- $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
- // 返回对象本身
- return $this;
- }
- // 执行上传
- public function uploadFile()
- {
- // 链式调用
- $this->checkError()->checkSize()->checkType()->isUploadFile()->makeFileName()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \UploadsException('执行失败,未知错误!');
- }
- return true;
- }
- // 获取名字
- public function getFileName()
- {
- return $this->fileName;
- }
- }
- try {
- $config = [
- // 'allowSize' => 20,
- ];
- $upload = new Uploads('image', $config);
- $result = $upload->uploadFile();
- if (2 > 1) {
- throw new Exception('你上传成功了?');
- }
-
- var_dump($result);
- } catch(UploadsException $e) {
- // 日志记录的操作
- echo $e->getMessage() . '<br>';
- // echo $e->getCode() . '<br>';
- // echo $e->getFile() . '<br>';
- // echo $e->getLine() . '<br>';
- } catch(Exception $e) {
- echo $e->getMessage() . '<br>';
- }
- echo '脚本结束!';
复制代码- <?php
- /*
- 异常处理
- 当代码发送错误之后,我们可以针对错误改变原来的执行流程,同时异常处理可以让我们跟踪错误节点。
- try
- catch
- Exception
- 它是系统所有异常的基类
- */
复制代码- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Document</title>
- </head>
- <body>
- <form action="./uploads.php" method="post" enctype="multipart/form-data">
- <input type="file" name="image">
- <input type="submit">
- </form>
- </body>
- </html>
复制代码- <?php
- class UploadsException extends \Exception
- {
- }
- // 文件上传类
- class Uploads
- {
- // 文件上传的信息
- protected $files = [];
- // 上传配置
- protected $config = [
- // 默认限定大小,为0表示不限制
- 'allowSize' => 0,
- // 默认限定类型,为空表示不限制
- 'allowType' => [],
- // 上传文件保存的目录
- 'uploadDir' => './upload/',
- ];
- // 随机名字的存储
- protected $fileName = '';
- // 文件的拓展名
- protected $ext = '';
- // 构造方法
- public function __construct(string $field, array $config = [])
- {
- // 保证存在字段
- if (!isset($_FILES[$field])) {
- throw new \UploadsException('上传文件的信息不存在!');
- }
- // 获取上传文件的信息
- $this->files = $_FILES[$field];
- // 合并配置
- $this->config = array_merge($this->config, $config);
- // 创建保存目录
- $this->makedir();
- }
- // 创建保存目录
- protected function makeDir()
- {
- // 处理保存文件的路径
- $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';
- // 确保这个路径存在
- if (!file_exists($this->config['uploadDir'])) {
- if (!mkdir($this->config['uploadDir'], 0777, true)) {
- throw new \UploadsException('创建保存目录失败,请检查权限问题!');
- }
- }
- }
- // 错误判断
- protected function checkError()
- {
- // 1. 确保文件上传的正确
- if ($this->files['error'] != 0)
- {
- // echo '上传错误';
- throw new \UploadsException('上传错误,错误号码:' . $this->files['error']);
- }
-
- // 返回对象本身
- return $this;
- }
- // 判断大小
- protected function checkSize()
- {
- // 2. 限定大小
- if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
- // echo '超出大小';
- throw new \UploadsException('超出大小,限定大小为:' . $this->config['allowSize']);
- }
- // 返回对象本身
- return $this;
- }
- // 判断类型
- protected function checkType()
- {
- $allowType = $this->config['allowType'];
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
- // echo '类型不允许';
- throw new \UploadsException('类型不允许,请检查配置文件!');
- }
- // 返回对象本身
- return $this;
- }
- // 判断合法性
- protected function isUploadFile()
- {
- // 4. 判断是否合法上传
- if (!is_uploaded_file($this->files['tmp_name'])) {
- throw new \UploadsException('非法上传!');
- }
- // 返回对象本身
- return $this;
- }
- // 生成随机名字
- protected function makeFileName()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- // 返回对象本身
- return $this;
- }
- // 获取拓展名
- protected function extension()
- {
- // 获取拓展名
- $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
- // 返回对象本身
- return $this;
- }
- // 执行上传
- public function uploadFile()
- {
- // 链式调用
- $this->checkError()->checkSize()->checkType()->isUploadFile()->makeFileName()->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- if (!move_uploaded_file($this->files['tmp_name'], $saveTo)) {
- throw new \UploadsException('执行失败,未知错误!');
- }
- return true;
- }
- // 获取名字
- public function getFileName()
- {
- return $this->fileName;
- }
- }
- try {
- $config = [
- // 'allowSize' => 20,
- ];
- $upload = new Uploads('image', $config);
- $result = $upload->uploadFile();
- if (2 > 1) {
- throw new Exception('你上传成功了?');
- }
-
- var_dump($result);
- } catch(UploadsException $e) {
- // 日志记录的操作
- echo $e->getMessage() . '<br>';
- // echo $e->getCode() . '<br>';
- // echo $e->getFile() . '<br>';
- // echo $e->getLine() . '<br>';
- } catch(Exception $e) {
- echo $e->getMessage() . '<br>';
- }
- echo '脚本结束!';
复制代码
|
|