当前位置:首页 > PHP教程 > php类库 > 列表

非常经典的PHP文件上传类分享

发布:smiling 来源: PHP粉丝网  添加日期:2021-08-05 11:00:56 浏览: 评论:0 

这篇文章主要为大家详细介绍了一个经典的PHP文件上传类,降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中,本文为大家分享了PHP文件上传类,需要的朋友可以参考下。

文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。

  1. <?php  
  2. /**  
  3.  +-----------------------------------------------------------------------------  
  4.  * 文件上传类  
  5.  +-----------------------------------------------------------------------------  
  6.  * @author Administrator  
  7.  +-----------------------------------------------------------------------------  
  8.  */ 
  9.  class FileUpload{  
  10.      
  11.   private $filepath;  //保存路径  
  12.   private $allowtype=array('gif','jpg','jpeg','png','txt');  
  13.   private $maxsize=1000000;  //最大允许上传大小  
  14.   private $israndname=true; //是否随机  
  15.   private $orginame//原始文件名  
  16.   private $tmpname;  //临时文件名  
  17.   private $newname;  //新文件名  
  18.   private $filetype//文件类型   
  19.   private $filesize//文件大小  
  20.   private $errornum=''//错误号  
  21.   private $errormsg//错误信息  
  22. /**  
  23.  +------------------------------------------------------------------------------  
  24.  *构造函数  
  25.  +------------------------------------------------------------------------------  
  26.  * @param string $savepath  保存路径  
  27.  * @param string $allowtype 允许类型  
  28.  * @param string $maxsize  允许大小  
  29.  *  
  30.  +------------------------------------------------------------------------------  
  31.  */    
  32.   function __construct($option=array()){  
  33.      foreach ($option as $key=>$value){  
  34.           
  35.       if (!in_array($key,get_class_vars(get_class($this)))){  
  36.         continue;  
  37.        }  
  38.       $this->setOption($key$value);   
  39.      }  
  40.   }  
  41.   function uploadfile($field) {  
  42.      $return=true;  
  43.     if (!$this->CheckPath()) {  
  44.       $this->errormsg=$this->geterrorNum();  
  45.       return false;  
  46.     }  
  47.     $name=$_FILES[$field]['name'];  
  48.     $tmpname=$_FILES[$field]['tmp_name'];  
  49.     $filesize=$_FILES[$field]['size'];  
  50.     $error=$_FILES[$field]['error'];   
  51.      if (is_array($name)) {  
  52.       $errors=array();  
  53.        for ($i=0;$i<count($name);$i++){  
  54.         if ($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$errors[$i])) {  
  55.           if (!$this->CheckSize() && !$this->CheckType()) {  
  56.             $errors=$this->getErrorNum();  
  57.             return false;  
  58.             }                                  
  59.         }else{  
  60.             $errors=$this->getErrorNum();  
  61.             return false;  
  62.         }  
  63.         if (!$return) {  
  64.           $this->getFile();  
  65.         }  
  66.        }  
  67.        if ($return) {  
  68.         $fileNames=array();  
  69.         for ($i=0;$i<count($name);$i++){  
  70.           if ($this->getFile($name[$i], $tmpname[$i], $filesize[$i], $filesize[$i])) {  
  71.             $this->SetFileName();  
  72.             if (!$this->MoveFile()) {  
  73.               $errors[]=$this->getErrorNum();  
  74.               $return=false;  
  75.             }else{  
  76.               $fileNames[]=$this->getNewName();  
  77.             }  
  78.           }          
  79.         }  
  80.         $this->newname=$fileNames;  
  81.        }  
  82.         $this->errormsg=$errors;  
  83.         return $return;  
  84.           
  85.      }else{   
  86.       if($this->getFile($name,$tmpname,filesize,$error)){  
  87.         if(!$this->CheckSize()){  
  88.           return false;  
  89.         }  
  90.         if(!$this->CheckType()){  
  91.           return false;  
  92.         }  
  93.          $this->SetFileName();  
  94.         if ($this->MoveFile()) {  
  95.             return true;  
  96.         }   
  97.       }else{  
  98.       return false;  
  99.       }  
  100.           
  101.       if (!$return) {  
  102.       $this->setOption('ErrorNum', 0);  
  103.       $this->errormsg=$this->geterrorNum();  
  104.       }  
  105.      return $return;   
  106.    }  
  107.   }  
  108.   /**  
  109.    +------------------------------------------------------------------------  
  110.    *设置类属性值函数  
  111.    +------------------------------------------------------------------------  
  112.    * @param mix $key  
  113.    * @param mix $value  
  114.    */ 
  115.   private function setOption($key,$value){  
  116.     $key=strtolower($key);  
  117.     $this->$key=$value;  
  118.   }  
  119.   /**  
  120.    +---------------------------------------------------------------------------  
  121.    * 获取文件变量参数函数  
  122.    +---------------------------------------------------------------------------  
  123.    * @param string $name  
  124.    * @param string $tmp_name  
  125.    * @param number $size  
  126.    * @param number $error  
  127.    */ 
  128.   private function getFile($name,$tmpname,$filetype,$filesize,$error=0){   
  129.        
  130.     $this->setOption('TmpName'$tmpname);  
  131.     $this->setOption('OrgiName'$name);  
  132.     $arrstr=explode('.'$name);  
  133.     $this->setOption('FileType'$arrstr[count($arrstr)-1]);       
  134.     $this->setOption('FileSize'$filesize);  
  135.     return true;  
  136.   }  
  137.   /**  
  138.    +-------------------------------------------------------------------------  
  139.    * 检查上传路径函数  
  140.    +-------------------------------------------------------------------------  
  141.    * @return boolean  
  142.    */ 
  143.   private function CheckPath(){  
  144.     if(emptyempty($this->filepath)){  
  145.       $this->setOption('ErrorNum', -5);  
  146.       return false;  
  147.     }  
  148.     if (!file_exists($this->filepath)||!is_writable($this->filepath)) {  
  149.        if (!@mkdir($this->filepath,0755)) {  
  150.          $this->setOption('ErrorNum',-4);  
  151.          return false;  
  152.        }  
  153.     }  
  154.     return true;  
  155.   }  
  156.   private function Is_Http_Post(){  
  157.     if (!is_uploaded_file($this->tmpname)) {  
  158.       $this->setOption('ErrorNum',-6);   
  159.       return false;  
  160.     }else{  
  161.       return true;  
  162.     }  
  163.   }  
  164.   /**  
  165.    +--------------------------------------------------------------------  
  166.    *检查文件尺寸函数  
  167.    +--------------------------------------------------------------------  
  168.    * @return boolean  
  169.    */ 
  170.   private function CheckSize(){  
  171.     if ($this->filesize>$this->maxsize) {  
  172.       $this->setOption('ErrorNum', -2);  
  173.       return false;  
  174.     }else{  
  175.       return true;  
  176.     }  
  177.   }  
  178.   /**  
  179.    +---------------------------------------------------------------  
  180.    * 检查文件类型函数  
  181.    +---------------------------------------------------------------  
  182.    * @return boolean  
  183.    */ 
  184.   private function CheckType(){  
  185.     if (in_array($this->filetype$this->allowtype)) {  
  186.       return true;  
  187.     }else{  
  188.       $this->setOption('ErrorNum', -1);  
  189.       return false;  
  190.     }  
  191.   }  
  192.   private function SetFileName(){  
  193.     if ($this->israndname) {  
  194.       $this->setOption('NewName'$this->RandName());  
  195.     }else{  
  196.       $this->setOption('NewName',$this->orginame);  
  197.     }   
  198.   }  
  199.   /**  
  200.    +-----------------------------------------------------------------  
  201.    * 获取新文件名  
  202.    +------------------------------------------------------------------  
  203.    */ 
  204.   public function getNewName() {  
  205.     return $this->newname;  
  206.   }  
  207.   private function RandName(){  
  208.     $rule=date("YmdHis").rand(0, 999);  
  209.     return $rule.'.'.$this->filetype;  
  210.   }  
  211.   private function MoveFile(){  
  212.     if ($this->errornum) {  
  213.       $filepath=rtrim($this->filaepath,'/').'/';  
  214.       $filepath.=$this->newname;  
  215.       if (@move_uploaded_file($this->tmpname,$filepath)) {  
  216.         return true;  
  217.        }else{  
  218.         $this->errormsg=$this->setOption('ErrorNum',-3 );  
  219.        }  
  220.     }else{  
  221.       return false;  
  222.     }  
  223.   }  
  224.   /**  
  225.    +----------------------------------------------------------------  
  226.    * 错误信息函数  
  227.    +----------------------------------------------------------------  
  228.    * @return string  
  229.    */ 
  230.    function getErrorNum() {  
  231.     $erstr="上传文件<font color='red'>{$this->orginame}</font>出错";  
  232.     switch ($this->errornum) {  
  233.       case 4:  
  234.        $erstr.="没有文件被上传";  
  235.         break;  
  236.       case 3:  
  237.        $erstr.="文件只被部分上传";  
  238.         break;  
  239.       case 2:  
  240.        $erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值";  
  241.         break;  
  242.       case 1:  
  243.        $erstr.="上传文件超过了php.ini配置文件中upload_max_filesize的值";  
  244.         break;  
  245.       case 0:  
  246.        $erstr="上传{$this->orginame}成功";  
  247.         break;         
  248.       case -1:  
  249.        $erstr="未允许的类型";  
  250.         break;  
  251.       case -2:  
  252.        $erstr.="文件过大,不能超过{$this->maxsize}个字节";   
  253.         break;  
  254.       case -3:  
  255.        $erstr.="上传失败";  
  256.         break;  
  257.       case -4:  
  258.        $erstr="创建上传目录失败,请重新指定上传目录";  
  259.         break;  
  260.       case -5:  
  261.        $erstr="未指定上传路径";  
  262.         break;  
  263.       case -6:  
  264.        $erstr="非法操作";  
  265.         break;                     
  266.       default:  
  267.        $erstr.="未知错误";  
  268.            
  269.     }  
  270.     return $erstr;  
  271.   }  
  272.  }  
  273. ?> 

以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。

Tags: PHP文件上传类

分享到: