form.htmlphp
<!DOCTYPE html> <html> <head> <title>文件上傳</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> <input type="file" name="spic"><br> <input type="submit" name="sub" value="上傳文件"> </form> </body> </html>
upload.phphtml
<?php include "./FileUpload.class.php"; $up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt','doc','pig','gif','php','jpg'),'filePath'=>'./upload/','maxSize'=>2000000)); if($up->uploadFile('spic')){ echo $up->getNewFileName(); }else{ echo $up->getErrorMsg(); } //var_dump($up); ?>
FileUpload.class.php數組
<?php class FileUpload{ //上傳文件保存的路徑 private $filePath; //容許上傳文件的類型 private $allowType=array('gif','jpg','png','jpeg'); //上傳文件的最大尺寸 1M private $maxSize=1000000; //是不是隨機文件名 private $isRandName=true; //原文件名稱 private $originName; //臨時文件名稱 private $tmpFileName; //文件類型 private $fileType; //文件的大小 private $fileSize; //新文件名 private $newFileName; //錯誤號 private $errorNum; //用來提供錯誤報告 private $errorMess; //用於對上傳文件的初始化 //1.指定上傳的路徑。2.容許的類型。3.限制大小。4.是否使用隨機文件名 //讓用戶能夠不用按位置傳參數,後面參數給值不用將前幾個參數也提供值 function __construct($options=array()){ /*$this->filePath=$filePath; $this->allowType=$allowType; $this->maxSize=$maxSize; $isRandName=$isRandName;*/ foreach ($options as $key => $value) { //將傳過來的$key全轉變成小寫 //$key=strtolower($key); //查看用戶參數中數組的下標是否和成員屬性名相同 if(!in_array($key,get_class_vars(get_class($this)))){ continue; } $this->setOption($key,$value); } /*print_r(get_class_vars(get_class($this)));*/ } private function setOption($key,$value){ $this->$key=$value; } 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.="文件過大,上傳文件不能超過{$thi->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)){ $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($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("Y").date("m").date("d").date("H").date("i").date("s").rand(100,999)."."; //隨機文件名 return $fileName.".".$this->fileType; } //用來上傳一個文件 function uploadFile($fileFied){ $return=true; //檢查文件上傳路徑 if(!$this->checkFilePath()){ $this->errorMess=$this->getError(); return false; } $name=$_FILES[$fileFied]['name']; $tmp_name=$_FILES[$fileFied]['tmp_name']; $size=$_FILES[$fileFied]['size']; $error=$_FILES[$fileFied]['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(!$return){ $this->errorMess=$this->getError(); } return $return; } //把上傳的文件從臨時文件中拷貝出來 private function copyFile(){ if($this->errorNum==0){ //不管上傳的路徑是否有「/」都加上「/」 $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',$arrStr[count($arrStr)-1]); $this->setOption('fileSize',$size); return true; } //用於獲取上傳後文件的文件名 function getNewFileName(){ return $this->newFileName; } //上傳若是失敗,則調用這個方法,就能夠查看錯誤報告 function getErrorMsg(){ return $this->errorMess; } } ?>