当前位置: 移动技术网 > IT编程>开发语言>PHP > PHP学习之文件上传类

PHP学习之文件上传类

2019年06月01日  | 移动技术网IT编程  | 我要评论

华龙网两江论坛,岳阳县一男孩溺亡,走遍天下书为侣ppt

<?php
$up = new upload();
$newpath = $up->uploadfile('fm');
if ($newpath === false) {
    var_dump($up->errornumber);
    var_dump($up->errorinfo);
} else {
    echo $newpath;
}

class upload
{
    //文件上传保存路径
    protected $path = './upload/';
    //允许文件上传的后缀
    protected $allowsuffix = ['jpg', 'jpeg', 'gif', 'wbmp', 'png'];
    //允许文件上传的mime类型
    protected $allowmime = ['image/jpeg', 'image/gif', 'image/wbmp', 'image/png'];
    //允许文件上传的文件最大大小
    protected $maxsize = 2000000;
    //是否启用随机名
    protected $israndname = true;
    //加上文件前缀
    protected $prefix = 'up_';

    //自定义的错误号码和错误信息
    protected $errornumber;
    protected $errorinfo;

    //文件的信息
    protected $oldname; //文件名
    protected $suffix; //文件后缀
    protected $size; //文件大小
    protected $mime; //文件mime
    protected $tmpname; //文件临时路径
    protected $newname; //文件新名字

    public function __construct($arr = [])
    {
        foreach ($arr as $key => $value) {
            $this->setoption($key, $value);
        }
    }

    public function __get($name)
    {
        if ($name == 'errornumber') {
            return $this->errornumber;
        } else if ($name == 'errorinfo') {
            return $this->geterrorinfo();
        }
    }

    /**
     * 判断这个$key是不是我的成员属性,如果是,则设置
     *
     * @param [type] $key
     * @param [type] $value
     * @return void
     */
    protected function setoption($key, $value)
    {
        //得到所有的成员属性
        $keys = array_keys(get_class_vars(__class__));
        if (in_array($key, $keys)) {
            $this->$key = $value;
        }
    }

    /**
     * 文件上传函数
     * $key 就是你input框中的name属性值
     *
     * @param [type] $key
     * @return void
     */
    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', $error);
            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;
        }
    }

    /**
     * 得到文件的新名字
     *
     * @return void
     */
    protected function createnewname()
    {
        //判断是否使用随机名
        if ($this->israndname) {
            $name = $this->prefix . uniqid() . '.' . $this->suffix;
        } else {
            $name = $this->prefix . $this->oldname;
        }
        return $name;
    }

    /**
     * 判断该路径是否存在,是否可写
     *
     * @return void
     */
    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;
    }

    /**
     * 提取文件相关信息并且保存到成员属性中
     *
     * @param [type] $key
     * @return void
     */
    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'];
    }

    /**
     * 判断文件大小
     *
     * @return void
     */
    protected function checksize()
    {
        if ($this->size > $this->maxsize) {
            $this->setoption('errornumber', -3);
            return false;
        }
        return true;
    }

    /**
     * 判断文件的mime是否符合
     *
     * @return void
     */
    protected function checkmime()
    {
        if (!in_array($this->mime, $this->allowmime)) {
            $this->setoption('errornumber', -4);
            return false;
        }
        return true;
    }

    /**
     * 判断文件的后缀是否符合
     *
     * @return void
     */
    protected function checksuffix()
    {
        if (!in_array($this->suffix, $this->allowsuffix)) {
            $this->setoption('errornumber', -5);
            return false;
        }
        return true;
    }

    /**
     * 返回错误信息
     *
     * @return void
     */
    protected function geterrorinfo()
    {
        switch ($this->errornumber) {
            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 = '文件超出php.ini设置大小';
                break;
            case 2:
                $str = '文件超出html设置大小';
                break;
            case 3:
                $str = '文件部分上传';
                break;
            case 4:
                $str = '没有文件上传';
                break;
            case 6:
                $str = '找不到临时文件';
                break;
            case 7:
                $str = '文件写入失败';
                break;
        }
        return $str;
    }
}

测试代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>上传文件</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="fm">
        <br />
        <input type="submit" value="上传">
    </form>
</body>
</html>

运行结果:

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网