加入收藏 | 设为首页 | 会员中心 | 我要投稿 菏泽站长网 (https://www.0530zz.cn/)- 数据工坊、负载均衡、数据快递、云计算、事件网格!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-06-20 09:12:21 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要为大家详细介绍了一个经典的PHP文件上传类,降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中,本文为大家分享了PHP文件上传类,需要的朋友可以参考下。 文件上传是项目开发中比较常见的功能,但
   这篇文章主要为大家详细介绍了一个经典的PHP文件上传类,降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中,本文为大家分享了PHP文件上传类,需要的朋友可以参考下。
 
  文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。
 
  <?php  
  /**  
   +-----------------------------------------------------------------------------  
   * 文件上传类  
   +-----------------------------------------------------------------------------  
   * @author Administrator  
   +-----------------------------------------------------------------------------  
   */
   class FileUpload{  
       
    private $filepath;  //保存路径  
    private $allowtype=array('gif','jpg','jpeg','png','txt');  
    private $maxsize=1000000;  //最大允许上传大小  
    private $israndname=true; //是否随机  
    private $orginame; //原始文件名  
    private $tmpname;  //临时文件名  
    private $newname;  //新文件名  
    private $filetype; //文件类型   
    private $filesize; //文件大小  
    private $errornum=''; //错误号  
    private $errormsg; //错误信息  
  /**  
   +------------------------------------------------------------------------------  
   *构造函数  
   +------------------------------------------------------------------------------  
   * @param string $savepath  保存路径  
   * @param string $allowtype 允许类型  
   * @param string $maxsize  允许大小  
   *  
   +------------------------------------------------------------------------------  
   */    
    function __construct($option=array()){  
       foreach ($option as $key=>$value){  
            
        if (!in_array($key,get_class_vars(get_class($this)))){  
          continue;  
         }  
        $this->setOption($key, $value);   
       }  
    }  
    function uploadfile($field) {  
       $return=true;  
      if (!$this->CheckPath()) {  
        $this->errormsg=$this->geterrorNum();  
        return false;  
      }  
      $name=$_FILES[$field]['name'];  
      $tmpname=$_FILES[$field]['tmp_name'];  
      $filesize=$_FILES[$field]['size'];  
      $error=$_FILES[$field]['error'];   
       if (is_array($name)) {  
        $errors=array();  
         for ($i=0;$i<count($name);$i++){  
          if ($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$errors[$i])) {  
            if (!$this->CheckSize() && !$this->CheckType()) {  
              $errors=$this->getErrorNum();  
              return false;  
              }                                  
          }else{  
              $errors=$this->getErrorNum();  
              return false;  
          }  
          if (!$return) {  
            $this->getFile();  
          }  
         }  
         if ($return) {  
          $fileNames=array();  
          for ($i=0;$i<count($name);$i++){  
            if ($this->getFile($name[$i], $tmpname[$i], $filesize[$i], $filesize[$i])) {  
              $this->SetFileName();  
              if (!$this->MoveFile()) {  
                $errors[]=$this->getErrorNum();  
                $return=false;  
              }else{  
                $fileNames[]=$this->getNewName();  
              }  
            }          
          }  
          $this->newname=$fileNames;  
         }  
          $this->errormsg=$errors;  
          return $return;  
            
       }else{   
        if($this->getFile($name,$tmpname,filesize,$error)){  
          if(!$this->CheckSize()){  
            return false;  
          }  
          if(!$this->CheckType()){  
            return false;  
          }  
           $this->SetFileName();  
          if ($this->MoveFile()) {  
              return true;  
          }   
        }else{  
        return false;  
        }  
            
        if (!$return) {  
        $this->setOption('ErrorNum', 0);  
        $this->errormsg=$this->geterrorNum();  
        }  
       return $return;   
     }  
    }  
    /**  
     +------------------------------------------------------------------------  
     *设置类属性值函数  
     +------------------------------------------------------------------------  
     * @param mix $key  
     * @param mix $value  
     */
    private function setOption($key,$value){  
      $key=strtolower($key);  
      $this->$key=$value;  
    }  
    /**  
     +---------------------------------------------------------------------------  
     * 获取文件变量参数函数  
     +---------------------------------------------------------------------------  
     * @param string $name  
     * @param string $tmp_name  
     * @param number $size  
     * @param number $error  
     */
    private function getFile($name,$tmpname,$filetype,$filesize,$error=0){   
         
      $this->setOption('TmpName', $tmpname);  
      $this->setOption('OrgiName', $name);  
      $arrstr=explode('.', $name);  
      $this->setOption('FileType', $arrstr[count($arrstr)-1]);       
      $this->setOption('FileSize', $filesize);  
      return true;  
    }  
    /**  
     +-------------------------------------------------------------------------  
     * 检查上传路径函数  
     +-------------------------------------------------------------------------  
     * @return boolean  
     */
    private function CheckPath(){  
      if(emptyempty($this->filepath)){  
        $this->setOption('ErrorNum', -5);  
        return false;  
      }  
      if (!file_exists($this->filepath)||!is_writable($this->filepath)) {  
         if (!@mkdir($this->filepath,0755)) {  
           $this->setOption('ErrorNum',-4);  
           return false;  
         }  
      }  
      return true;  
    }  
    private function Is_Http_Post(){  
      if (!is_uploaded_file($this->tmpname)) {  
        $this->setOption('ErrorNum',-6);   
        return false;  
      }else{  
        return true;  
      }  
    }  
    /**  
     +--------------------------------------------------------------------  
     *检查文件尺寸函数  
     +--------------------------------------------------------------------  
     * @return boolean  
     */
    private function CheckSize(){  
      if ($this->filesize>$this->maxsize) {  
        $this->setOption('ErrorNum', -2);  
        return false;  
      }else{  
        return true;  
      }  
    }  
    /**  
     +---------------------------------------------------------------  
     * 检查文件类型函数  
     +---------------------------------------------------------------  
     * @return boolean  
     */
    private function CheckType(){  
      if (in_array($this->filetype, $this->allowtype)) {  
        return true;  
      }else{  
        $this->setOption('ErrorNum', -1);  
        return false;  
      }  
    }  
    private function SetFileName(){  
      if ($this->israndname) {  
        $this->setOption('NewName', $this->RandName());  
      }else{  
        $this->setOption('NewName',$this->orginame);  
      }   
    }  
    /**  
     +-----------------------------------------------------------------  
     * 获取新文件名  
     +------------------------------------------------------------------  
     */
    public function getNewName() {  
      return $this->newname;  
    }  
    private function RandName(){  
      $rule=date("YmdHis").rand(0, 999);  
      return $rule.'.'.$this->filetype;  
    }  
    private function MoveFile(){  
      if ($this->errornum) {  
        $filepath=rtrim($this->filaepath,'/').'/';  
        $filepath.=$this->newname;  
        if (@move_uploaded_file($this->tmpname,$filepath)) {  
          return true;  
         }else{  
          $this->errormsg=$this->setOption('ErrorNum',-3 );  
         }  
      }else{  
        return false;  
      }  
    }  
    /**  
     +----------------------------------------------------------------  
     * 错误信息函数  
     +----------------------------------------------------------------  
     * @return string  
     */
     function getErrorNum() {  
      $erstr="上传文件<font color='red'>{$this->orginame}</font>出错";  
      switch ($this->errornum) {  
        case 4:  
         $erstr.="没有文件被上传";  
          break;  
        case 3:  
         $erstr.="文件只被部分上传";  
          break;  
        case 2:  
         $erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值";  
          break;  
        case 1:  
         $erstr.="上传文件超过了php.ini配置文件中upload_max_filesize的值";  
          break;  
        case 0:  
         $erstr="上传{$this->orginame}成功";  
          break;         
        case -1:  
         $erstr="未允许的类型";  
          break;  
        case -2:  
         $erstr.="文件过大,不能超过{$this->maxsize}个字节";   
          break;  
        case -3:  
         $erstr.="上传失败";  
          break;  
        case -4:  
         $erstr="创建上传目录失败,请重新指定上传目录";  
          break;  
        case -5:  
         $erstr="未指定上传路径";  
          break;  
        case -6:  
         $erstr="非法操作";  
          break;                     
        default:  
         $erstr.="未知错误";  
             
      }  
      return $erstr;  
    }  
   }  
  ?>
  以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。

(编辑:菏泽站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读