• 葡萄牙西班牙明晨上演B组焦点战 谁才是真正铁嘴钢牙? 2019-04-17
  • 回复@不能这样啊:那你不是可以啥事不做天天甩起手耍?你自己不求上进还不准别人有所追求么? 2019-04-17
  • 人民网评:为改革创新撑腰,“为官不为”行不通了 2019-04-16
  • 【新时代 新作为 新篇章】特色枣木香菇畅销市场 2019-04-09
  • 惊坛一周汇总:稳定农产品价格,政府和市场谁都不能“旷课” 2019-04-07
  • 巴克利:詹姆斯不会去76人的,因为他需要球权 2019-04-02
  • 高考不过是人生一隅,前路满是阳光花香 2019-03-29
  • 文件上传类:
    功能:实现文件上传。本类仅仅供初学者参考,具体需求还需具体分析。

    <?php

    class fileup{

        private $filepath='./';//文件路径
        private $allowmime=array(//准许MIME
        'image/jpeg',
        'image/jpg',
        'image/pjpeg',
        'image/gif',
        'image/png',
        'image/x-png'
        );
        
        private $allowsub=array('jpg','jpeg','png','gif');//准许后缀
        private $maxsize=2000000;//准许大小
        private $subfix;//当前的后缀名
        private $israndname=true;//是否启用随机文件名
        private $size;//当前的大小
        private $orgname;//文件原名
        private $mime;//当前的MIME
        private $tmpname;//临时文件名
        private $errornum;//错误号
        private $errorinfo;//错误信息
        private $prefix='up_';//前缀
        private $newfilename;//组合得到的新文件名

        /*============初始化成员方法==========
         *通过这里的修改方法我们可以在初始化的时候,方便修改成员属性
         *$arr=array(
         *    'filepath'=>'images',
         *    'allowsize'=>'3000000',
         *    'allowmime'=>array('传一个数组'),
         *    'allowsub'=>array('传一个数组'),
         *    'israndname'=>'1',
         *    'prefix'=>'wx_'
         *);
         * */

        public function __construct($array=array('filepath'=>'../www/')){
            foreach($array as $key=>$val){
                $key=strtolower($key);
                if(!array_key_exists($key,get_class_vars(get_class($this)))){
                    //如果不存在成员属性的数组里,设置错误号
                    $this->setoption('error','-8');
                    echo $this->geterror();//报错提示错误号
                    continue;
                }
                //调用成员方法然后修改成员属性
                $this->setoption($key,$val);
            }
        }

        //修改成员属性的方法
        private function setoption($key,$val){
            $this->$key=$val;
        }
        
        //文件上传方法
        public function up($field){
            if(!$this->checkpath()){//第一步,检测路径是否存在
                return false;
            }
            $flag=false;//第二步,执行多文件上传的时候做一个标记位置

            //第三步,获得上传文件属性值,赋给变量
            $name=$_FILES[$field]['name'];
            $size=$_FILES[$field]['size'];
            $tmpname=$_FILES[$field]['tmp_name'];
            $mime=$_FILES[$field]['type'];
            $error=$_FILES[$field]['error'];

            //第四步,判断是不是多文件上传
            if(is_array($name)){
                //处理多文件上传处理
                for($i=0,$j=count($name);$i<$j;$i++){
                    if($this->setfiles($name[$i],$size[$i],$tmpname[$i],$mime[$i],$error[$i])){
                        if(!$this->checksize()|!$this->checksub()|!$this->checkmime()){
                            $errorinfo[]=$this->geterror();
                            $flag=false;
                        }
                    }else{
                        $errorinfo[]=$this->geterror().'<br />';
                        $falg=false;
                    }
                }
                for($i=0,$j=count($name);$i<$j;$i++){
                    if($this->setfiles($name[$i],$size[$i],$tmpname[$i],$mime[$i],$error[$i])){
                        if($this->checksize()&&$this->checksub()&&$this->checkmime()){
                            $newfilename[]=$this->newfilename;
                            $this->move();
                        }
                    }
                }
                $this->newfilename=$newfilename;
                if(!$flag){
                    $this->errorinfo=$errorinfo;
                }
                return $this->newfilename;
            }else{
                //执行单文件上传
                //将这些的文件的属性赋值给成员属性
                if($this->setfiles($name,$size,$tmpname,$mime,$error)){
                    //检测文件相关信息是否符合
                    if($this->checksize() && $this->checksub() && $this->checksub()){
                        if($this->move()){//移动文件
                            return $this->prefix.$this->newfilename;//返回上传的新文件名
                        }else{
                            return false;
                        }
                    }else{
                        return false;
                    }
                }else{
                    return false;
                }
            }
        }
        
        //将上传文件的属性赋值给成员属性
        private function setfiles($name,$size,$tmpname,$mime,$error){
            if($error){//如果存在错误号
                $this->setoption('errornum',$error);
                return false;
            }
            $this->orgname=$name;
            $this->size=$size;
            $this->tmpname=$tmpname;
            $this->mime=$mime;
            $subfix=explode('.',$this->orgname);
            $this->subfix=array_pop($subfix);
            //检测是否开启随机文件名,将文件名赋值给成员属性
            if(!$this->israndname){
                //不启用的话新文件名为前缀拼接原文件名
                $this->newfilename=$this->prefix.$this->orgname;
            }else{
                //启用的话,调用创建新文件名的方法
                $this->newfilename=$this->prefix.$this->createnewname();
            }
            return true;
        }
        
        //检测文件后缀是否符合
        private function checksub(){
            if(in_array($this->subfix,$this->allowsub)){
                return true;
            }else{
                return false;
            }
        }
        
        //检测文件的MIME类型
        private function checkmime(){
            if(in_array($this->mime,$this->allowmime)){
                return true;
            }else{
                return false;
            }
        }
        
        //检测文件的大小是否符合
        private function checksize(){
            if($this->size>$this->maxsize){
                $this->setoption('errornum',-3);
                return false;
            }else{
                return true;
            }
        }
        
        //文件的移动的方法
        private function move(){
            if(is_uploaded_file($this->tmpname)){//检测是不是上传文件
                //检测文件移动是否成功
                if(move_uploaded_file($this->tmpname,$this->filepath.$this->newfilename)){
                    echo '文件上传成功';
                    return true;
                }else{
                    $this->setoption('errornum',-7);
                    return false;
                }
            }else{
                $this->setoption('errornum',-6);
                return false;
            }
        }

        //创建新文件名的方法
        private function createnewname(){
            return uniqid().'.'.$this->subfix;
        }
        
        //检测的路径
        private function checkpath(){
            if(empty($this->filepath)){
                $this->setoption('errornum',-1);
                return false;
            }
            $this->filepath=rtrim($this->filepath,'/').'/';
            if(!file_exists($this->filepath) || !is_writeable($this->filepath)){
                if(mkdir($this->filepath,0777,true)){
                    return true;
                }else{
                    $this->setoption('errornum',-2);
                    return false;
                }
            }else{
                return true;
            }
        }
        
        public function geterror(){
            switch($this->errornum){
                case -1:
                    $string='请指定上传目录';
                break;
                case -2:
                    $string='文件路径穿件失败';
                break;
                case -3:
                    $string='文件超过了指定的大小';
                break;
                case -4:
                    $string='文件后缀不允许';
                break;
                case -5:
                    $string='文件的MIME类型不允许';
                break;
                case -6:
                    $string='不是上传文件';
                break;
                case -7:
                    $string='移动文件失败';
                break;
                case 1:
                    $string='超过了PHP指定的大小';
                break;
                case 2:
                    $string='超过了表单准许的大小';
                break;
                case 3:
                    $string='文件只有部分被上传';
                break;
                case 4:
                    $string='没有文件被上传';
                break;
                case 6:
                    $string='没有找到临时文件夹';
                break;
                case 7:
                    $string='文件写入失败';
                break;
            }
            return $string;
        }
    }
    ?>


    然成科技是一家本土的云南软件开发公司,2017年获得云南省科技厅、省财政厅、省税务局等机构认定的高新技术企业。定位于高端网站设计、系统开发、APP开发、微信公众号、浙江11选5前二直选走势图。拥有多个软著权,公司先后为多家事业单位提供服务,比如会泽文化馆、宣威文化馆、中科院昆明植物研究所等。其中中国科学院昆明植物研究所已经进行了长达4年的合作,并且还持续合作中!

    排列五:中国 · 云南 · 昆明

    然成科技微信二维码
    扫一扫关注然成微信

    浙江11选5前二直选走势图 www.whjl8.com 办公室:云南省昆明市盘龙区白云路北京路花苑3幢403(地铁2号线白云路站)

  • 葡萄牙西班牙明晨上演B组焦点战 谁才是真正铁嘴钢牙? 2019-04-17
  • 回复@不能这样啊:那你不是可以啥事不做天天甩起手耍?你自己不求上进还不准别人有所追求么? 2019-04-17
  • 人民网评:为改革创新撑腰,“为官不为”行不通了 2019-04-16
  • 【新时代 新作为 新篇章】特色枣木香菇畅销市场 2019-04-09
  • 惊坛一周汇总:稳定农产品价格,政府和市场谁都不能“旷课” 2019-04-07
  • 巴克利:詹姆斯不会去76人的,因为他需要球权 2019-04-02
  • 高考不过是人生一隅,前路满是阳光花香 2019-03-29