非常经典的PHP文件上传类分享
文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。
<?php /** +----------------------------------------------------------------------------- *文件上传类 +----------------------------------------------------------------------------- *@authorAdministrator +----------------------------------------------------------------------------- */ classFileUpload{ 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;//错误信息 /** +------------------------------------------------------------------------------ *构造函数 +------------------------------------------------------------------------------ *@paramstring$savepath保存路径 *@paramstring$allowtype允许类型 *@paramstring$maxsize允许大小 * +------------------------------------------------------------------------------ */ function__construct($option=array()){ foreach($optionas$key=>$value){ if(!in_array($key,get_class_vars(get_class($this)))){ continue; } $this->setOption($key,$value); } } functionuploadfile($field){ $return=true; if(!$this->CheckPath()){ $this->errormsg=$this->geterrorNum(); returnfalse; } $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(); returnfalse; } }else{ $errors=$this->getErrorNum(); returnfalse; } 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()){ returnfalse; } if(!$this->CheckType()){ returnfalse; } $this->SetFileName(); if($this->MoveFile()){ returntrue; } }else{ returnfalse; } if(!$return){ $this->setOption('ErrorNum',0); $this->errormsg=$this->geterrorNum(); } return$return; } } /** +------------------------------------------------------------------------ *设置类属性值函数 +------------------------------------------------------------------------ *@parammix$key *@parammix$value */ privatefunctionsetOption($key,$value){ $key=strtolower($key); $this->$key=$value; } /** +--------------------------------------------------------------------------- *获取文件变量参数函数 +--------------------------------------------------------------------------- *@paramstring$name *@paramstring$tmp_name *@paramnumber$size *@paramnumber$error */ privatefunctiongetFile($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); returntrue; } /** +------------------------------------------------------------------------- *检查上传路径函数 +------------------------------------------------------------------------- *@returnboolean */ privatefunctionCheckPath(){ if(empty($this->filepath)){ $this->setOption('ErrorNum',-5); returnfalse; } if(!file_exists($this->filepath)||!is_writable($this->filepath)){ if(!@mkdir($this->filepath,0755)){ $this->setOption('ErrorNum',-4); returnfalse; } } returntrue; } privatefunctionIs_Http_Post(){ if(!is_uploaded_file($this->tmpname)){ $this->setOption('ErrorNum',-6); returnfalse; }else{ returntrue; } } /** +-------------------------------------------------------------------- *检查文件尺寸函数 +-------------------------------------------------------------------- *@returnboolean */ privatefunctionCheckSize(){ if($this->filesize>$this->maxsize){ $this->setOption('ErrorNum',-2); returnfalse; }else{ returntrue; } } /** +--------------------------------------------------------------- *检查文件类型函数 +--------------------------------------------------------------- *@returnboolean */ privatefunctionCheckType(){ if(in_array($this->filetype,$this->allowtype)){ returntrue; }else{ $this->setOption('ErrorNum',-1); returnfalse; } } privatefunctionSetFileName(){ if($this->israndname){ $this->setOption('NewName',$this->RandName()); }else{ $this->setOption('NewName',$this->orginame); } } /** +----------------------------------------------------------------- *获取新文件名 +------------------------------------------------------------------ */ publicfunctiongetNewName(){ return$this->newname; } privatefunctionRandName(){ $rule=date("YmdHis").rand(0,999); return$rule.'.'.$this->filetype; } privatefunctionMoveFile(){ if($this->errornum){ $filepath=rtrim($this->filaepath,'/').'/'; $filepath.=$this->newname; if(@move_uploaded_file($this->tmpname,$filepath)){ returntrue; }else{ $this->errormsg=$this->setOption('ErrorNum',-3); } }else{ returnfalse; } } /** +---------------------------------------------------------------- *错误信息函数 +---------------------------------------------------------------- *@returnstring */ functiongetErrorNum(){ $erstr="上传文件<fontcolor='red'>{$this->orginame}</font>出错"; switch($this->errornum){ case4: $erstr.="没有文件被上传"; break; case3: $erstr.="文件只被部分上传"; break; case2: $erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值"; break; case1: $erstr.="上传文件超过了php.ini配置文件中upload_max_filesize的值"; break; case0: $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程序设计有所帮助。