设为首页 加入收藏

TOP

PHP学习之文件上传类(一)
2019-08-15 23:27:50 】 浏览:31
Tags:PHP 习之 文件 上传
<?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
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深拷贝和浅拷贝 下一篇base64编码原理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目