php檔案上傳類及PHP封裝的多檔案上傳類分享

來源:互聯網
上載者:User
本文主要和大家分享php檔案上傳類及PHP封裝的多檔案上傳類的相關代碼,具有一定的參考價值,感興趣的小夥伴們可以參考一下,希望能協助到大家。


<?php$upload = new UpLoad();$upload->uploadFile('fm');/*列印錯誤資訊*/// var_dump($upload->errorNumber);// var_dump($upload->errorInfo);class UpLoad{  //檔案上傳路徑  protected $path = 'upload/';  //允許檔案上傳的尾碼  protected $allowSuffix = ['jpg','jpeg',  'gif','wbmp','png'];  //mime類型   protected $allowMime =['image/jpg','image/jpeg',  'image/gif','image/wbmp','image/png'];  //允許上傳的大小  protected $maxSize = 2000000;  //是否啟用預設的首碼  protected $isRandName =true ;  //檔案的首碼  protected $prefix = 'up_';  //錯誤號碼和錯誤資訊  protected $errorNumber;  protected $errorInfo;  //檔案的資訊  //檔案名稱  protected $oldName;  //檔案的尾碼  protected $suffix;  //檔案的大小  protected $size;  //檔案的mime  protected $mime;  //檔案的臨時檔案的路徑  protected $tmpName;  //檔案新名字  protected $newName;    //構造方法  //因為成員屬性比較多就用數組來顯示  public function __construct($arr =[]){    foreach ($arr as $key=>$value){      $this->setOption($key,$value);    }  }  //判斷$key是不是我的成員屬性,如果是就設定  protected function setOption($key,$value){    //得到所有的成員屬性    $keys = array_keys(get_class_vars(__CLASS__));    if(in_array($key, $keys)){      $this->$key = $value;    }  }  //檔案上傳函數  //key 就是input框中的name屬性值  public function uploadFile($key){    //判斷有沒有設定路徑 path    if(empty($this->path)){      $this->setOption('errorNumber',-1 );      return false;    }    //判斷該路徑是否存在是否可寫    if (!$this->check()){      $this->setOption('errorNumber', -2);      return false;     }    //判斷$_FILES裡面的error資訊是否為0,如果為0則說明檔案資訊在伺服器端可以直接擷取,提取資訊儲存到成員屬性中    $error = $_FILES[$key]['error'];    if($error){      $this->setOption('errorNumber', -3);      return false;    }else {      //提取檔案相關資訊並且儲存到成員屬性中      $this->getFileInfo($key);    }    //判斷檔案的大小、mime、尾碼是否符合     if(!$this->checkSize() || !$this->checkMime()|| !$this->checkSuffix()){       return false;     }    //得到新的檔案名稱字    $this->newName = $this->createNewName();    //判斷是否是上傳檔案,並且是移動上傳檔案    if(is_uploaded_file($this->tmpName)){      if(move_uploaded_file($this->tmpName, $this->path.$this->newName)){        return $this->path.$this->newName;      }else {        $this->setOption('errorNumber', -7);        return false;      }    }else{      $this->setOption('errorNumber', -6);      return false;    }  }  //檢測檔案夾是否存在,是否可寫  protected function check(){    //檔案夾不存在或者不是目錄。建立檔案夾    if(!file_exists($this->path) ||!is_dir($this->path)){      return mkdir($this->path,0777,true);    }    //判斷檔案是否可寫    if(!is_writeable($this->path)){      return chmod($this->path, 0777);    }    return true;  }  //根據key得到檔案資訊  protected function getFileInfo($key){    //得到檔案的名字    $this->oldName = $_FILES[$key]['name'];    //得到檔案的mime類型    $this->mime = $_FILES[$key]['type'];    //得到檔案的臨時檔案    $this->tmpName = $_FILES[$key]['tmp_name'];    //得到檔案大小    $this->size = $_FILES[$key]['size'];    //得到檔案尾碼    $this->suffix = pathinfo($this->oldName)['extension'];  }  //判斷檔案大小  protected function checkSize(){    if($this->size > $this->maxSize){      $this->setOption('errorNumber', -3);      return false;    }    return true;  }  //判斷mime類型  protected function checkMime(){    if(!in_array($this->mime, $this->allowMime)){      $this->setOption('errorNumber', -4);      return false;    }    return true;  }  //判斷尾碼  protected function checkSuffix(){    if(!in_array($this->suffix, $this->allowSuffix)){      $this->setOption('errorNumber', -5);      return false;    }    return true;  }  //建立新名字  protected function createNewName(){    if($this->isRandName){      $name = $this->prefix.uniqid().'.'.$this->suffix;    }else {      $name = $this->prefix.$this->oldName;    }    return $name;  }  public function __get($name){    if($name == 'errorNumber'){      return $this->errorNumber;    }elseif ($name == 'errorInfo'){      return $this->getErrorInfo();    }  }  protected function getErrorInfo(){    switch ($this->errorNumber){    case -1:      $str = '檔案路徑沒有設定';      break;    case -2:      $str = '檔案不是目錄或者不可寫';      break;    case -3:      $str = '檔案超過指定大小';      break;    case -4:      $str = 'mime類型不符合';      break;    case -5:      $str = '檔案尾碼不符合';      break;    case -6:      $str = '不是上傳檔案';      break;    case -7:      $str = '移動失敗';      break;    case 1:      $str = '超出ini設定大小';      break;    case 2:      $str = '超出html表單大小';      break;    case 3:      $str = '文章只有部分上傳';      break;    case 4:      $str = '沒有檔案上傳';      break;    case 6:      $str = '找不到臨時檔案';      break;    case 7:      $str = '檔案寫入失敗';      break;    }    return $str;  }}


<!doctype html><html lang="en"><head>  <meta charset="UTF-8" />  <title>檔案上傳</title></head><body><form action="UpLoad.php" method="post" enctype="multipart/form-data" >   <input type="file" name="fm" value=""><br>  <input type="submit" value="上傳檔案" /><br> </form></body></html>

注意:input中的name必須和上傳類中的uploadFile中是傳值一致!

PHP封裝的多檔案上傳類執行個體與用法詳解:

<?php/**//* * @(#)UploadFile.php * * 可同時處理使用者多個上傳檔案。效驗檔案有效性後儲存至指定目錄。 * 可返回上傳檔案的相關有用資訊供其它程式使用。(如檔案名稱、類型、大小、儲存路徑) * 使用方法請見本類底部(UploadFile類使用注釋)資訊。 * */class UploadFile { var $user_post_file = array(); //使用者上傳的檔案 var $save_file_path;  //存放使用者上傳檔案的路徑 var $max_file_size;   //檔案最大尺寸 var $last_error;   //記錄最後一次出錯資訊 //預設允許使用者上傳的檔案類型 var $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf'); var $final_file_path; //最終儲存的檔案名稱 var $save_info = array(); //返回一組有用資訊,用於提示使用者。 /**//** * 建構函式,用與初始化相關資訊,使用者待上傳檔案、儲存路徑等 * * @param Array $file 使用者上傳的檔案 * @param String $path 儲存使用者上傳檔案的路徑 * @param Integer $size 允許使用者上傳檔案的大小(位元組) * @param Array $type  此數組中存放允計使用者上傳的檔案類型 */ function UploadFile($file, $path, $size = 2097152, $type = '') { $this->user_post_file = $file; $this->save_file_path = $path; $this->max_file_size = $size; //如果使用者不填寫檔案大小,則預設為2M. if ($type != '')  $this->allow_type = $type; } /**//** * 儲存使用者上傳檔案,檢驗合法性通過後,儲存至指定位置。 * @access public * @return int  值為0時上傳失敗,非0表示上傳成功的個數。 */ function upload() { for ($i = 0; $i < count($this->user_post_file['name']); $i++) {  //如果當前檔案上傳功能,則執行下一步。  if ($this->user_post_file['error'][$i] == 0) {  //取當前檔案名稱、臨時檔案名稱、大小、副檔名,後面將用到。  $name = $this->user_post_file['name'][$i];  $tmpname = $this->user_post_file['tmp_name'][$i];  $size = $this->user_post_file['size'][$i];  $mime_type = $this->user_post_file['type'][$i];  $type = $this->getFileExt($this->user_post_file['name'][$i]);  //檢測當前上傳檔案大小是否合法。  if (!$this->checkSize($size)) {   $this->last_error = "The file size is too big. File name is: ".$name;   $this->halt($this->last_error);   continue;  }  //檢測當前上傳副檔名是否合法。  if (!$this->checkType($type)) {   $this->last_error = "Unallowable file type: .".$type." File name is: ".$name;   $this->halt($this->last_error);   continue;  }  //檢測當前上傳檔案是否非法提交。  if(!is_uploaded_file($tmpname)) {   $this->last_error = "Invalid post file method. File name is: ".$name;   $this->halt($this->last_error);   continue;  }  //移動檔案後,重新命名檔案用。  $basename = $this->getBaseName($name, ".".$type);  //移動後的檔案名稱  $saveas = $basename."-".time().".".$type;  //組合新檔案名稱再存到指定目錄下,格式:儲存路徑 + 檔案名稱 + 時間 + 副檔名  $this->final_file_path = $this->save_file_path."/".$saveas;  if(!move_uploaded_file($tmpname, $this->final_file_path)) {   $this->last_error = $this->user_post_file['error'][$i];   $this->halt($this->last_error);   continue;  }  //儲存當前檔案的有關資訊,以便其它程式調用。  $this->save_info[] = array("name" => $name, "type" => $type,      "mime_type" => $mime_type,               "size" => $size, "saveas" => $saveas,               "path" => $this->final_file_path);  } } return count($this->save_info); //返回上傳成功的檔案數目 } /**//** * 返回一些有用的資訊,以便用於其它地方。 * @access public * @return Array 返回最終儲存的路徑 */ function getSaveInfo() { return $this->save_info; } /**//** * 檢測使用者提交檔案大小是否合法 * @param Integer $size 使用者上傳檔案的大小 * @access private * @return boolean 如果為true說明大小合法,反之不合法 */ function checkSize($size) { if ($size > $this->max_file_size) {  return false; } else {  return true; } } /**//** * 檢測使用者提交檔案類型是否合法 * @access private * @return boolean 如果為true說明類型合法,反之不合法 */ function checkType($extension) { foreach ($this->allow_type as $type) {  if (strcasecmp($extension , $type) == 0)  return true; } return false; } /**//** * 顯示出錯資訊 * @param $msg  要顯示的出錯資訊 * @access private */ function halt($msg) { printf("<b><UploadFile Error:></b> %s <br>\n", $msg); } /**//** * 取副檔名 * @param String $filename 給定要取副檔名的檔案 * @access private * @return String   返回給定副檔名 */ function getFileExt($filename) { $stuff = pathinfo($filename); return $stuff['extension']; } /**//** * 取給定檔案檔案名稱,不包括副檔名。 * eg: getBaseName("j:/hexuzhong.jpg"); //返回 hexuzhong * * @param String $filename 給定要取檔案名稱的檔案 * @access private * @return String 返迴文件名 */ function getBaseName($filename, $type) { $basename = basename($filename, $type); return $basename; }}/**//******************** UploadFile類使用注釋//注意,上傳組件name屬性不管是一個還是多個都要使用數組形式,如:<input type="file" name="user_upload_file[]"><input type="file" name="user_upload_file[]">//如果使用者點擊了上傳按鈕。if ($_POST['action'] == "上傳") { //設定允許使用者上傳的檔案類型。 $type = array('gif', 'jpg', 'png', 'zip', 'rar'); //執行個體化上傳類,第一個參數為使用者上傳的檔案組、第二個參數為儲存路徑、 //第三個參數為檔案最大大小。如果不填則預設為2M //第四個參數為充許使用者上傳的類型數組。如果不填則預設為gif, jpg, png, zip, rar, txt, doc, pdf $upload = new UploadFile($_FILES['user_upload_file'], 'j:/tmp', 100000, $type); //上傳使用者檔案,返回int值,為上傳成功的檔案個數。 $num = $upload->upload(); if ($num != 0) { echo "上傳成功<br>"; //取得檔案的有關資訊,檔案名稱、類型、大小、路徑。用print_r()列印出來。 print_r($upload->getSaveInfo()); //格式為: Array //  ( //  [0] => Array( //    [name] => example.txt //    [type] => txt //    [size] => 526 //    [path] => j:/tmp/example-1108898806.txt //    ) //  ) echo $num."個檔案上傳成功"; } else { echo "上傳失敗<br>"; }}*/?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.