php上傳類

<?php
	class FileUpload {
		private $filepath;     //指定上傳文件保存的路徑
		private $allowtype=array('gif', 'jpg', 'png', 'jpeg');  //充許上傳文件的類型
		private $maxsize=1000000;  //允上傳文件的最大長度 1M
		private $israndname=true;  //是否隨機重命名, true false不隨機,使用原文件名
		private $originName;   //源文件名稱
		private $tmpFileName;   //臨時文件名
		private $fileType;  //文件類型
		private $fileSize;  //文件大小
		private $newFileName; //新文件名
		private $errorNum=0;  //錯誤號
		private $errorMess=""; //用來提供錯誤報告



		//用於對上傳文件初使化
		//1. 指定上傳路徑, 2,充許的類型, 3,限制大小, 4,是否使用隨機文件名稱
		//讓用戶能夠不用按位置傳參數,後面參數給值不用將前幾個參數也提供值
		function __construct($options=array()){
			foreach($options as $key=>$val){
				$key=strtolower($key);
				//查看用戶參數中數組的下標是否和成員屬性名相同
				if(!in_array($key,get_class_vars(get_class($this)))){
					continue;
				}

				$this->setOption($key, $val);
			}
		 
		
		}
	


		private function getError(){
			$str="上傳文件<font color='red'>{$this->originName}</font>時出錯:";

			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.'<br>';
		}
	
		//用來檢查文件上傳路徑
		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;
			}
		}
		//設置上傳後的文件名稱
		private function setNewFileName(){
			if($this->israndname){
				$this->setOption('newFileName', $this->proRandName());
			} else {
				$this->setOption('newFileName', $this->originName);
			}
		}



		//設置隨機文件名稱
		private function proRandName(){
			$fileName=date("YmdHis").rand(100,999);
			return $fileName.'.'.$this->fileType;
		}
	
		private function setOption($key, $val){
			$this->$key=$val;
		}
		//用來上傳一個文件
		function uploadFile($fileField){
			$return=true;
			//檢查文件上傳路徑
			if(!$this->checkFilePath()){
				$this->errorMess=$this->getError();
				return false;
			}

			
			$name=$_FILES[$fileField]['name'];
			$tmp_name=$_FILES[$fileField]['tmp_name'];
			$size=$_FILES[$fileField]['size'];
			$error=$_FILES[$fileField]['error'];

			if(is_Array($name)){
				$errors=array();

				for($i=0; $i<count($name); $i++){
					if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
						if(!$this->checkFileSize() || !$this->checkFileType()){
							$errors[]=$this->getError();
							$return=false;
						}
					}else{
						$error[]=$this->getError();
						$return=false;
					}

					if(!$return)
						$this->setFiles();
				}

				if($return){
					$fileNames=array();

					for($i=0; $i<count($name); $i++){
						if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
							$this->setNewFileName();
							if(!$this->copyFile()){
								$errors=$this->getError();
								$return=false;
							}else{
								$fileNames[]=$this->newFileName;
							}
						}
					}

					$this->newFileName=$fileNames;
				}

				$this->errorMess=$errors;
				return $return;
			} else {
				
					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(!$return)
						$this->errorMess=$this->getError();


					return $return;
			}			
		}

		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;
				}
					
			}else{
				return false;
			}
		}

		//設置和$_FILES有關的內容
		private function setFiles($name="", $tmp_name='', $size=0, $error=0){
		
			$this->setOption('errorNum', $error);
				
			if($error){
				return false;
			}

			$this->setOption('originName', $name);
			$this->setOption('tmpFileName', $tmp_name);
			$arrStr=explode('.', $name); 
			$this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
			$this->setOption('fileSize', $size);	

			return true;
		}	

		//用於獲取上傳後文件的文件名
		function getNewFileName(){
			return $this->newFileName;
		}
		//上傳若是失敗,則調用這個方法,就能夠查看錯誤報告
		function getErrorMsg() {
			return $this->errorMess;
		}
	}
相關文章
相關標籤/搜索