上传文件类

<?php
    class FileUpload{
        private $filepath;//指定上传文件保存的路径
        private $allowtype=array('gif','jpg','png','jpeg');
        private $maxsize=1000000;//上传文件的最大长度 1M
        private $israndname=true;//是否随机重命名,true表示随机
        private $originName;    //原文件名
        private $tmpFileName;   //临时文件名
        private $fileType;  //文件类型
        private $fileSize;
        private $newfileName;   //新文件名
        private $errorNum=0;    //错误号
        private $errorMess="";  //错误消息
 
    /*  //初始化上传文件,这种初始化要求用户必须按顺序赋值,并且不可以将前几个属性值省略赋值,
        function __construct($filepath,$allowetype,$maxsize,$israndname){
            $this->filepath = $filepath;
            $this->allowetype = $allowtype;
            $this->maxsize = $maxsize;
            $this->israndname = $israndname;
        } */
        //让用户不用按位置传参数,后面参数给值不用将前几个参数也提供值,将参数作为数组,可以解决这类问题
        function __construct($options=array()){
             
            foreach($options as $key=>$val){
                //解决用户赋值时大小写问题
                $key = strtolower($key);
            //判断用户参数中数组的下标是否和成员属性相同
            //get_class_vars()获得对象成员属性,get_class()获得对象名
                if(!in_array($key,get_class_vars(get_class($this)))){      
                    continue;
                }
                $this->setOption($key,$val);
 
            }
        }
 
        //将值赋给对应属性
        private function setOption($key,$val){
            $this->$key = $val;
        }
 
        //获取错误信息
        private function getError(){
            $str="上传文件<font color='red'>{$this->originName}</font>时出错:";
             
            switch($this->errorNum){
                case 4:
                    $str.="没有文件被上传";
                    break;
                case 3:
                    $str.="文件只有部分上传";
                    break;
                case 2:
                    $str.="上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值";
                    break;
                case 1:
                    $str.="上传文件超过了php.ini中upload_max_filesize选项的值";
                    break;
                case -1:
                    $str.="未允许的类型";
                    break;
                case -2:
                    $str.="文件过大,不能超过{$this->maxsize}个字节";
                    break;
                case -3:
                    $str.="上传文件失败";
                    break;
                case -4:
                    $str.="建立存放上传文件的目录失败,请重新指定上传的目录";
                    break;
                case -5:
                    $str.="必须指定上传文件的路径";
                    break;
                default:
                    $str.="未知错误";
            }
 
            return $str.'<br>';
 
             
        }
 
        //用来检查文件上传路径
        private function checkFilePath(){  
            if(empty($this->filepath)){
                $this->setOption('errorNum',-5);
                return false;
            }
 
            if(!file_exists($this->filepath) || !is_writeable($this->filepath)){
                if(!@mkdir($this->filepath,0755)){
                    $this->setOption('errorNum',-4);
                    return false;
                }
            }
            return true;
        }
     
        //检查文件尺寸
        private function checkFileSize(){
            if($this->fileSize > $this->maxsize){
                $this->setOption('errorNum','-2');
                return false;
            }else{
                return true;
            }
        }
 
        //检查文件类型
        private function checkFileType(){
            if(in_array(strtolower($this->fileType),$this->allowtype)){
                return true;
            }else{
                $this->setOption('errorNum','-1');
                return false;
            }
        }
 
        //设置上传后的文件名
        private function setNewFileName(){
            if($this->israndname){
                $this->setOption("newFileName",$this->proRandName());
            }else{
                $this->setOption("newFileName",$this->originName);
            }
        }
 
        //设置随机文件名称
        private function proRandName(){
            $fileName = date("YmdHis").rand(100,999);
            return $fileName.".".$this->fileType;
        }
 
        //用来上传一个文件
        function uploadfile($fileField){
            $return = true;
            //检查文件上传路径
            if(!$this->checkFilePath()){
                $this->errorMess=$this->getError();  
                return false;
            }
            $name=$_FILES[$fileField]['name'];
            $tmp_name=$_FILES[$fileField]['tmp_name'];
            $size=$_FILES[$fileField]['size'];
            $error=$_FILES[$fileField]['error'];
            //echo $error;
            if($this->setFiles($name,$tmp_name,$size,$error)){
                if($this->checkFileSize() && $this->checkFileType()){
                    $this->setNewFileName();
                    if($this->copyFile()){
                        return true;
                    }else{
                        $return = false;
                    }
                }else{
                    $return = false;
                }
            }else{
                $return = false;
            }
             
            if($return){
                $this->errorMess=$this->getError();
            }
            return $return;
        }
 
        //上传文件
        private function copyFile(){
            if(!$this->errorNum){
                $filepath=rtrim($this->filepath,'/').'/';
                $filepath.=$this->newFileName;
 
                if(@move_uploaded_file($this->tmpFileName,$filepath)){
                    return true;
                 
                }else{
                    $this->setOption('errorNum','-3');
                    return false;
                }
            }else{
                return false;
            }
        }
 
        //设置和$_FILES有关的内容
        private function setFiles($name="",$tmp_name="",$size=0,$error=0){
            $this->setOption('errorNum',$error);
 
            if($error){
                return false;
            }
 
            $this->setOption('originName',$name);
            $this->setOption('tmpFileName',$tmp_name);
            $arr=explode('.',$name);
            $this->setOption('fileType',strtolower($arr[count($arr)-1]));
            $this->setOption('fileSize',$size);
 
            return true;
        }
 
        //用于获取上传后文件的文件名
        function getNewFileName(){
            return $this->newFileName;
        }
 
        //上传如果失败,则调用这个方法,就可以输出错误消息
        function getErrorMsg(){
            return $this->errorMess;
        }
 
    }
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值