程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP中的一個很好用的文件上傳類

PHP中的一個很好用的文件上傳類

編輯:關於PHP編程

<?php
 
 class 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;
    }
   }
  }
 
 
 }

?>


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved