php封装文件上传类

<?php
$upload = new Upload();
$upload->uploadFile('fm');
$upload->errorInfo;
class Upload{
   //文件上传保存路径
   protected $path = './imgLoad';
   //允许文件保存的后缀
   protected $allowSuffix = ['jpg','jpeg','gif','wbmp','png'];
   //允许文件保存的mime类型
   protected $allowMine = ['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);
	  }
   }
   //判断这个$key是不是我的成员属性,如果是则设置
   protected function setOption($key,$value){
     //得到所有成员属性
     $keys = array_keys(get_class_vars(__CLASS__));
	 //如果$key是我的成员属性 那么就设置值
	 if(in_array($key,$keys)){
	   $this->$key = $value;
	 }
   }
   
   //文件上传函数
   //$key 是你在input框中的name属性值
   public function uploadFile($key){
   
       //判断有没有设置路径 path
	   
	   if(empty($this->path)){
	     $this->setOption('errorNumber',-1);
		 return false;
	   }
	   
	   //判断该路径是否存在,是否可写
	   if(!$this->check()){
	     echo("操<br/>");
	     $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)){
         //var_dump($this->tmpName); C:\Windows\php2189.tmp
	     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;	   
	   }
   }
   
   protected function check(){
      //文件夹不存在或者不是目录,就创建文件夹
	  //is_dir() - 判断给定文件名是否是一个目录 
	  if(!file_exists($this->path)|| !is_dir($this->path)){
	    return mkdir($this->path,0777,true);//第三个参数是否嵌套创建目录:为真时,mkdir("/path/to/my/dir", 0700,true);可以创建成功;默认时,默认为假。则会提示找不到目录。
	  }
	  if(!is_writeable($this->path)){
	    return chmod($this->path,0777);
	  }
	  
	  return true;
	  
   }
   
   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'];	 	 
	  
   }
   
   protected function checkSize(){
     if($this->size > $this->maxSize){
	   $this->setOption('errorNumber',-3);
	   return false;
	 }
	 return true;
   }
   
   protected function checkMime(){
      if(!in_array($this->mime,$this->allowMine)){
	   $this->setOption('errorNumber',-4);
	   return false;	  
	  }
	  return true;
   }
   
    protected function checkSuffix(){
      if(!in_array($this->suffix,$this->allowSuffix)){
	   $this->setOption('errorNumber',-5);
	   return false;	  
	  }
	  return true;
   }  
   
   protected function createNewName(){
      if($this->isRandName){
	    $name = $this->prefix.uniqid().'.'.$this->suffix;
	  }else{
	    $name = $this->prefix.$this->oldName;
	  }
	  return $name;
   }
   
   public function __get($name){
      if($name == 'errorNumber'){
	    return $this->errorNumber;
	  }else if($name=='errorInfo'){
	    return $this->getErrorInfo();
	  }
   }
   
   protected function getErrorInfo(){
      //1到7是默认的错误信息
      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;
		 default:
		 	  $str = '没有错';	
			  break;		 		 		 		 		 		 		 		 		 
	  }
      //var_dump($str);
	  return $str;
   }
}

html代码

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="fm" />
  <input type="submit" value="上传" />
</form>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值