博主信息
博文 12
粉丝 0
评论 1
访问量 7266
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
8.8【文件上传与自定义异常】
小陈先生的博客
原创
840人浏览过

实例

MyException.php
<?php

namespace _0808;
use Exception;
use Throwable;
class MyException extends Exception{
    public function __construct($message = "", $code = 0, Throwable $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }

    //自定义错误信息的输出样式
    public function errorInfo(){
        return <<< ERROR
                     <h2>
                        <strong>{$this->getCode()}</strong>
                         <span style='color:red'>{$this->getMessage()}</span>
                     </h2>
                    ERROR;
        ;
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

upload.php
<?php
namespace _0808;
require 'MyException.php';
try{
    $upload = new UpLoad();

    $upload->uploadFile('pic');

    echo $upload->errorInfo;
}catch(MyException $exception){
    echo $exception->errorInfo();
}


class UpLoad{

    //文件上传路径

    protected $path = '/uploads/';

    //允许文件上传的后缀

    protected $allowSuffix = ['jpg','jpeg',

        'gif','wbmp','png'];

    //mime类型

    protected $allowMime =['image/jpg','image/jpeg',

        'image/gif','image/wbmp','image/png'];

    //允许上传的大小

    protected $maxSize = 3145728;

    //是否启用默认的前缀

    protected $isRandName =true ;

    //文件的前缀

    protected $prefix = 'up_';

    //错误号和错误信息

    protected $errorNumber;

    protected $errorInfo;

    //文件的信息

    //文件名

    protected $oldName;

    //文件的后缀

    protected $suffix;

    //文件的大小

    protected $size;

    //文件的mime

    protected $mime;

    //文件的临时文件的路径

    protected $tmpName;

    //文件新名字

    protected $newName;



    //构造方法

    //因为成员属性比较多就用数组来显示

    public function __construct($arr =[]){

        foreach ($arr as $key=>$value){

            $this->setOption($key,$value);

        }

    }

    //判断$key是不是我的成员属性,如果是就设置

    protected function setOption($key,$value){

        //得到所有的成员属性

        $keys = array_keys(get_class_vars(__CLASS__));

        if(in_array($key, $keys)){

            $this->$key = $value;

        }

    }

    //文件上传函数

    //key 就是input框中的name属性值

    public function uploadFile($key){

        //判断有没有设置路径 path

        if(empty($this->path)){

            $this->setOption('errorNumber',-1 );

            return false;

        }

        //判断该路径是否存在是否可写

        if (!$this->check()){

            $this->setOption('errorNumber', -2);

            return false;

        }

        //判断$_FILES里面的error信息是否为0,如果为0则说明文件信息在服务器端可以直接获取,提取信息保存到成员属性中

        $error = $_FILES[$key]['error'];

        if($error){

            $this->setOption('errorNumber', -3);

            return false;

        }else {

            //提取文件相关信息并且保存到成员属性中

            $this->getFileInfo($key);

        }

        //判断文件的大小、mime、后缀是否符合

        if(!$this->checkSize() || !$this->checkMime()|| !$this->checkSuffix()){

            return false;

        }

        //得到新的文件名字

        $this->newName = $this->createNewName();

        //判断是否是上传文件,并且是移动上传文件

        if(is_uploaded_file($this->tmpName)){

            if(move_uploaded_file($this->tmpName, $this->path.$this->newName)){

                return $this->path.$this->newName;

            }else {

                $this->setOption('errorNumber', -7);

                return false;

            }

        }else{

            $this->setOption('errorNumber', -6);

            return false;

        }

    }

    //检测文件夹是否存在,是否可写

    protected function check(){

        //文件夹不存在或者不是目录。创建文件夹

        if(!file_exists($this->path) ||!is_dir($this->path)){

            return mkdir($this->path,0777,true);

        }

        //判断文件是否可写

        if(!is_writeable($this->path)){

            return chmod($this->path, 0777);

        }

        return true;

    }

    //根据key得到文件信息

    protected function getFileInfo($key){

        //得到文件的名字

        $this->oldName = $_FILES[$key]['name'];

        //得到文件的mime类型

        $this->mime = $_FILES[$key]['type'];

        //得到文件的临时文件

        $this->tmpName = $_FILES[$key]['tmp_name'];

        //得到文件大小

        $this->size = $_FILES[$key]['size'];

        //得到文件后缀

        $this->suffix = pathinfo($this->oldName)['extension'];

    }

    //判断文件大小

    protected function checkSize(){

        if($this->size > $this->maxSize){

            $this->setOption('errorNumber', -3);

            return false;

        }

        return true;

    }

    //判断mime类型

    protected function checkMime(){

        if(!in_array($this->mime, $this->allowMime)){

            $this->setOption('errorNumber', -4);

            return false;

        }

        return true;

    }

    //判断后缀

    protected function checkSuffix(){

        if(!in_array($this->suffix, $this->allowSuffix)){

            $this->setOption('errorNumber', -5);

            return false;

        }

        return true;

    }

    //创建新名字

    protected function createNewName(){

        if($this->isRandName){

            $name = $this->prefix.uniqid().'.'.$this->suffix;

        }else {

            $name = $this->prefix.$this->oldName;

        }

        return $name;

    }

    public function __get($name){

        if($name == 'errorNumber'){

            return $this->errorNumber;

        }elseif ($name == 'errorInfo'){

            return $this->getErrorInfo();

        }

    }

    protected function getErrorInfo(){

        switch ($this->errorNumber){
            case 0:
                $str = '上传成功';
                break;
            case -1:

                $str = '文件路径没有设置';

                break;

            case -2:

                $str = '文件不是目录或者不可写';

                break;

            case -3:

                $str = '文件超过指定大小';

                break;

            case -4:

                $str = 'mime类型不符合';

                break;

            case -5:

                $str = '文件后缀不符合';

                break;

            case -6:

                $str = '不是上传文件';

                break;

            case -7:

                $str = '移动失败';

                break;

            case 1:

                $str = '超出ini设置大小';

                break;

            case 2:

                $str = '超出html表单大小';

                break;

            case 3:

                $str = '文章只有部分上传';

                break;

            case 4:

                $str = '没有文件上传';

                break;

            case 6:

                $str = '找不到临时文件';

                break;

            case 7:

                $str = '文件写入失败';

                break;

        }

        if($this->errorNumber!==0){
            throw new MyException($str,-1);
        }else{
            return $str;
        }

    }

}

运行实例 »

点击 "运行实例" 按钮查看在线实例

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="pic" id="">
        <input type="hidden" name="MAX_FILE_SIZE" value="">
        <input type="submit" value="上传">

    </form>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学