找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 729|回复: 0

异常处理

[复制链接]

296

主题

38

回帖

1272

积分

管理员

积分
1272
发表于 2021-4-22 12:46:36 | 显示全部楼层 |阅读模式
upload
  1. <?php
  2.        
  3.         /*
  4.                 文件上传:
  5.                         客户端将指定文件传输到服务器。

  6.                 $_FILES
  7.                         文件上传的超全局数组,存储各种上传文件的信息
  8.        
  9.                 error 错误号:
  10.                         0 表示成功
  11.                         1 表示上传文件大小超出了约定值。 php.ini 配置 upload_max_filesize = 2M
  12.                         2 表示上传文件大小超出了HTML表单隐藏属性的 MAX_FILE_SIZE 指定的大小
  13.                         3 表示文件值被上传一部分
  14.                         4 表示没有上传的文件
  15.                         6 表示找不到临时文件
  16.                         7 表示文件写入失败

  17.                 php.ini
  18.                         限制PHP处理上传文件的大小
  19.                         upload_max_filesize = 2M

  20.                         是否开启文件上传
  21.                         file_uploads = On
  22.                        
  23.                         上传文件的临时路径
  24.                         upload_tmp_dir
  25.         */

  26.         // $result = upload('upload_file', './test', 0, []);
  27.         $result = upload('upload_file');

  28.         // 1. 无法知道代码内部错误的细节是什么!

  29.         echo '上传结果:';
  30.         var_dump($result);

  31.         function upload(string $field, string $upload_dir = './upload', int $allowSize = 0, array $allowType = []): bool
  32.         {
  33.                 // 获取上传文件的信息
  34.                 $files = $_FILES[$field];

  35.                 // 限定允许大小
  36.                 // $allowSize = 2048000;
  37.                 // 0 表示不限制
  38.                 // $allowSize = 0;

  39.                 // 限定类型
  40.                 // $allowType = ['image/png', 'image/gif'];
  41.                 // 空 表示不限定
  42.                 // $allowType = [];

  43.                 // 指定上传文件存储的路径
  44.                 // $upload_dir = './upload/';

  45.                 // 处理保存文件的路径
  46.                 $upload_dir = rtrim($upload_dir, '/') . '/';

  47.                 // 确保这个路径存在
  48.                 if (!file_exists($upload_dir)) {
  49.                         $result = mkdir($upload_dir, 0777, true);
  50.                         if (!$result) {
  51.                                 return 1;
  52.                                 return false;
  53.                         }
  54.                 }

  55.                 // 1. 确保文件上传的正确
  56.                 if ($files['error'] != 0)
  57.                 {
  58.                         // echo '上传错误';
  59.                         return 2;
  60.                         return false;
  61.                 }

  62.                 // 2. 限定大小
  63.                 if ($allowSize > 0 && $files['size'] > $allowSize) {
  64.                         // echo '超出大小';
  65.                         return 3;
  66.                         return false;
  67.                 }

  68.                 // 3. 限定类型
  69.                 if (count($allowType) > 0 && !in_array($files['type'], $allowType)) {
  70.                         // echo '类型不允许';
  71.                         return false;
  72.                 }

  73.                 // 4. 判断是否合法上传
  74.                 $is_uploaded_file = is_uploaded_file($files['tmp_name']);
  75.                 if (!$is_uploaded_file) {
  76.                         return false;
  77.                 }

  78.                 // 生成随机的文件名字
  79.                 $filename = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());

  80.                 // 获取拓展名
  81.                 $ext = pathinfo($files['name'], PATHINFO_EXTENSION);

  82.                 $saveTo = $upload_dir . $filename . '.' . $ext;

  83.                 // 5. 执行上传
  84.                 $result = move_uploaded_file($files['tmp_name'], $saveTo);
  85.                
  86.                 return $result;

  87.         }

  88.         $code = upload('uploadfile');
  89.         if ($code == 1) {
  90.                 echo '路径不存在';
  91.         } else if ($code == 2) {
  92.                 echo 'xxxx';
  93.         } else if ($code == 3) {
  94.                 echo 'xxxxx';
  95.         }
复制代码
uploads
  1. <?php

  2. // 文件上传类
  3. class Uploads
  4. {
  5.         // 文件上传的信息
  6.         protected $files = [];

  7.         // 上传配置
  8.         protected $config = [
  9.                 // 默认限定大小,为0表示不限制
  10.                 'allowSize' => 0,
  11.                 // 默认限定类型,为空表示不限制
  12.                 'allowType' => [],
  13.                 // 上传文件保存的目录
  14.                 'uploadDir' => './upload/',
  15.         ];

  16.         // 随机名字的存储
  17.         protected $fileName = '';

  18.         // 文件的拓展名
  19.         protected $ext = '';

  20.         // 构造方法
  21.         public function __construct(string $field, array $config = [])
  22.         {
  23.                 if (!isset($_FILES[$field])) {
  24.                         return false;
  25.                 }

  26.                 // 获取上传文件的信息
  27.                 $this->files = $_FILES[$field];

  28.                 // 合并配置
  29.                 $this->config = array_merge($this->config, $config);

  30.                 // 创建保存目录
  31.                 $this->makedir();
  32.                
  33.         }

  34.         // 创建保存目录
  35.         protected function makeDir()
  36.         {
  37.                 // 处理保存文件的路径
  38.                 $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';

  39.                 // 确保这个路径存在
  40.                 if (!file_exists($this->config['uploadDir'])) {
  41.                         $result = mkdir($this->config['uploadDir'], 0777, true);
  42.                         if (!$result) {
  43.                                 return false;
  44.                         }
  45.                 }
  46.         }

  47.         // 错误判断
  48.         protected function checkError()
  49.         {
  50.                 // 1. 确保文件上传的正确
  51.                 if ($this->files['error'] != 0)
  52.                 {
  53.                         // echo '上传错误';
  54.                         return false;
  55.                 }
  56.         }

  57.         // 判断大小
  58.         protected function checkSize()
  59.         {
  60.                 // 2. 限定大小
  61.                 if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
  62.                         // echo '超出大小';
  63.                         return false;
  64.                 }
  65.         }

  66.         // 判断类型
  67.         protected function checkType()
  68.         {
  69.                 $allowType = $this->config['allowType'];

  70.                 // 3. 限定类型
  71.                 if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
  72.                         // echo '类型不允许';
  73.                         return false;
  74.                 }
  75.         }

  76.         // 判断合法性
  77.         protected function isUploadFile()
  78.         {
  79.                 // 4. 判断是否合法上传
  80.                 $is_uploaded_file = is_uploaded_file($this->files['tmp_name']);
  81.                 if (!$is_uploaded_file) {
  82.                         return false;
  83.                 }
  84.         }

  85.         // 生成随机名字
  86.         protected function makeFileName()
  87.         {
  88.                 // 生成随机的文件名字
  89.                 $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
  90.         }

  91.         // 获取拓展名
  92.         protected function extension()
  93.         {
  94.                 // 获取拓展名
  95.                 $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
  96.         }

  97.         // 执行上传
  98.         public function uploadFile()
  99.         {
  100.                 $this->checkError();
  101.                 $this->checkSize();
  102.                 $this->checkType();
  103.                 $this->isUploadFile();
  104.                 $this->makeFileName();
  105.                 $this->extension();

  106.                 $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;

  107.                 // 5. 执行上传
  108.                 $result = move_uploaded_file($this->files['tmp_name'], $saveTo);
  109.                
  110.                 return $result;

  111.         }
  112. }

  113. $config = [
  114.         'allowSize' => 20,
  115. ];
  116. $upload = new Uploads('image', $config);

  117. $result = $upload->uploadFile();
  118. var_dump($result);

  119. echo '<pre>';
  120.         print_r($upload);
  121. echo '</pre>';
复制代码
from
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4.         <meta charset="UTF-8">
  5.         <title>Document</title>
  6. </head>
  7. <body>

  8.         <form action="./uploads.php" method="post" enctype="multipart/form-data">
  9.                 <input type="file" name="image">
  10.                 <input type="submit">
  11.         </form>
  12. </body>
  13. </html>
复制代码
demo
  1. <?php

  2. /*
  3.         异常处理
  4.                 当代码发送错误之后,我们可以针对错误改变原来的执行流程,同时异常处理可以让我们跟踪错误节点。

  5.         try

  6.         catch

  7.         Exception
  8. */
  9.        
  10. /*
  11.         1. 所有的代码都要放在 try 里面
  12.         2. 当满足某些条件,触发了异常,它会改变程序的执行流程,抛出异常,转到 catch 中执行。
  13. */

  14. try {
  15.         echo 'start:';

  16.         // 业务代码的执行
  17.         $x = 1;
  18.         if ($x > 1) {
  19.                 throw new Exception('你的值太大了!', 110);
  20.         }

  21.         echo 'end:';

  22. } catch(Exception $e) {
  23.         echo 'catch:';
  24.         echo $e->getMessage() . '<br>';
  25.         echo $e->getCode() . '<br>';
  26.         echo $e->getFile() . '<br>';
  27.         echo $e->getLine() . '<br>';
  28. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|外汇论坛 ( 粤ICP备16021788号 )

GMT+8, 2024-5-10 14:56 , Processed in 0.072440 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表