PHP中的一個很好用的文件上傳類
<?phpclass FileUpload{
private $filepath; //設置上傳文件的路徑 private $allowtype=array('jpg','jpeg','gif','bmp'); //默認的文件的類型 private $maxsize=2000000; //默認文件的大小 private $israndname=true; //是否使用隨機文件名 private $originName; //源文件名稱 private $tmpFileName; //臨時文件名 private $fileType; //文件類型 private $fileSize; //文件的大小 private $newFileName; //新文件的名稱 private $errorNum; //錯誤號 private $errorMess=""; //用來提示錯誤報告 //用于文件初始化的函數 function __construct($options=array()){ foreach($options as $key=>$val){ $key=strtolower($key);//設置屬性名稱均為小寫 //get_class_vars(get_class($this)) //獲取當前類的所有的屬性 if(!in_array($key,get_class_vars(get_class($this)))){ continue; } else { $this->setOption($key,$val); } } }
//定義不同的錯誤級別 private function getError(){ $str="<font color='red'>上傳文件{$this->originName}時出錯:";
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."</font><br/>"; }
//為成員屬性賦值的函數 private function setOption($key,$val){ $this->$key=$val; } //用于檢查上傳文件的路徑 private function checkFilePath(){ //如果文件路徑為空 if(empty($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 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; } } //上傳一個文件 function uploadFile($fileField){ $return=true; $name=$_FILES[$fileField]["name"]; //post提交的名稱 $tmp_name=$_FILES[$fileField]["tmp_name"]; //上傳時的臨時文件名 $size=$_FILES[$fileField]["size"]; $error=$_FILES[$fileField]["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(!$this->checkFilePath()){ $this->errorMess=$this->getError(); return false; }
if(!$return) { $this->errorMess=$this->getError(); } return $return; } //設置和$_FILES有關的內容 private function setFiles($name="",$tmp_name="",$size=0,$error=0){ $this->setOption("errorNum",$error); if($this->errorNum){ return false; } $arrstr=explode(".",$name); $this->setOption("fileType",strtolower($arrstr[count($arrstr)-1])); $this->setOption("originName",$name); $this->setOption("tmpFileName",$tmp_name); $this->setOption("fileSize",$size); return true; }
//用于獲取上傳文件后文件的名稱 function getNewFileName(){ return $this->newFileName.'上傳成功!'; }
//上傳文件失敗時,顯示錯誤信息的函數 function getErrorMsg(){ return $this->errorMess; } private function proRandName(){ $filename=date("YmdHis").rand(100,999); return $filename.".".$this->fileType; }
//設置上傳后的文件名稱 private function setNewFileName(){ if($this->israndname){ $this->setOption('newFileName',$this->proRandName()); } else { $this->setOption('newFileName',$this->originName); } }
//拷貝文件 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; } } }
}
?></pre>