//

Information for details

php常用类分享之文件上传类

文件上传类:
功能:实现文件上传。本类仅仅供初学者参考,具体需求还需具体分析。

<?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开发、微信公众号、微信小程序开发。拥有多个软著权,公司先后为多家事业单位提供服务,比如会泽文化馆、宣威文化馆、中科院昆明植物研究所等。其中中国科学院昆明植物研究所已经进行了长达4年的合作,并且还持续合作中!

  • 滇公网安备 53010202001388号