摘要:總結(jié)定義成員屬性,要輸入的信息定義構(gòu)造方法或配置方法實(shí)現(xiàn)連貫操作定義主方法上傳方法檢查文件路徑是否合法將文件上傳的信息取出賦給變量如果是多個(gè)文件夾上傳則會(huì)是數(shù)組先循環(huán)檢查文件合法性再上傳定義各種輔助方法
/** * PHP通用文件上傳類 * * 支持單文件和多文件上傳 */ class FileUpload{ //要配置的內(nèi)容 private $path = "./uploads"; private $allowtype = array("jpg", "gif", "png"); private $maxsize = 1000000; private $israndname = true; private $originName; private $tmpFileName; private $fileType; private $fileSize; private $newFileName; private $errorNum = 0; private $errorMess = ""; /** * 用于設(shè)置成員屬性($path, $allowtype, $maxsize, $israndname) * 可以通過(guò)連貫操作一次設(shè)置多個(gè)屬性值 * @param $key 成員屬性(不區(qū)分大小寫) * @param $val 為成員屬性設(shè)置的值 * @return object 返回自己對(duì)象$this, 可以用于連貫操作 */ function set($key, $val){ $key = strtolower($key); if (array_key_exists($key, get_class_vars(get_class($this)))){ $this->setOption($key, $val); } return $this; } /** * 調(diào)用該方法上傳文件 * Enter description here ... * @param $fileField 上傳文件的表單名稱 */ function upload($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(); //多個(gè)文件上傳則循環(huán)處理,這個(gè)循環(huán)只有檢查上傳文件的作用,并沒有真正上傳 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{ $errors[] = $this->getError(); $return = false; } //如果有問(wèn)題,則重新初始化屬性 if (!$return){ $this->setFiles(); } } if ($return) { //存放所有上傳后文件名的變量數(shù)組 $fileNames = array(); //如果上傳的多個(gè)文件都是合法的,則通過(guò)循環(huán)向服務(wù)器上傳文件 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; } $fileNames[] = $this->newFileName; } } $this->newFileName = $fileNames; } $this->errorMess = $errors; return $return; }else{ //設(shè)置文件信息 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; } //獲取上傳后的文件名稱 public function getFileName(){ return $this->newFileName; } //上傳失敗后,調(diào)用該方法則返回,上傳出錯(cuò)信息 public function getErrorMsg(){ return $this->errorMess; } //設(shè)置上傳出錯(cuò)信息 public function getError(){ $str = "上傳文件{$this->originName}時(shí)出錯(cuò):"; switch ($this->errorNum) { case 4: $str.= "沒有文件被上傳"; break; case 3: $str.= "文件只有部分被上傳"; break; case 2: $str.= "上傳文件的大小超過(guò)了HTML表單中MAX_FILE_SIZE選項(xiàng)指定的值"; break; case 1: $str.= "上傳的文件超過(guò)了php.ini中upload_max_filesize選項(xiàng)限制的值"; break; case -1: $str.= "未允許的類型"; break; case -2: $str.= "文件過(guò)大, 上傳的文件夾不能超過(guò){$this->maxsize}個(gè)字節(jié)"; break; case -3: $str.= "上傳失敗"; break; case -4: $str.= "建立存放上傳文件目錄失敗,請(qǐng)重新指定上傳目錄"; break; case -5: $str.= "必須指定上傳文件的路徑"; break; default: $str .= "未知錯(cuò)誤"; } return $str."
"; } //設(shè)置和$_FILES有關(guān)的內(nèi)容 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); $aryStr = explode(".", $name); $this->setOption("fileType", strtolower($aryStr[count($aryStr)-1])); $this->setOption("fileSize", $size); return true; } //為單個(gè)成員屬性設(shè)置值 private function setOption($key, $val){ $this->$key = $val; } //設(shè)置上傳后的文件名稱 private function setNewFileName(){ if ($this->israndname) { $this->setOption("newFileName", $this->proRandName()); }else{ $this->setOption("newFileName", $this->originName); } } //檢查上傳的文件是否是合法的類型 private function checkFileType(){ if (in_array(strtolower($this->fileType), $this->allowtype)) { return true; }else{ $this->setOption("errorNum", -1); return false; } } //檢查上傳的文件是否是允許的大小 private function checkFileSize(){ if ($this->fileSize > $this->maxsize) { $this->setOption("errorNum", -5); return false; }else{ return true; } } //檢查是否有存放上傳文件的目錄 private function checkFilePath(){ if (empty($this->path)) { $this->setOption("errorNum", -5); return false; } if (!file_exists($this->path) || !is_writable($this->path)) { if (!@mkdir($this->path, 0755)) { $this->setOption("errorNum", -4); return false; } } return true; } //設(shè)置隨機(jī)文件名 private function proRandName(){ $fileName = date("YmdHis")."_".rand(100,999); return $fileName.".".$this->fileType; } //復(fù)制上傳文件到指定的位置 private function copyFile(){ if (!$this->errorNum) { $path = rtrim($this->path, "/")."/"; $path.= $this->newFileName; if (@move_uploaded_file($this->tmpFileName, $path)) { return true; }else{ $this->setOption("errorNum", -3); return false; } }else{ return false; } } }
抄來(lái)的文件上傳來(lái),作為鞏固面向?qū)ο笾R(shí)。
總結(jié): 1. 定義成員屬性,要輸入的信息 2. 定義構(gòu)造方法或配置方法(set()實(shí)現(xiàn)連貫操作) 3. 定義主方法(上傳方法upload()) 1. 檢查文件路徑是否合法 2. 將文件上傳的信息取出賦給變量 3. 如果是多個(gè)文件夾上傳則$file["name"]會(huì)是數(shù)組 1.先循環(huán)檢查文件合法性 2.再上傳 4. 定義各種輔助方法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/20814.html
摘要:是超文本預(yù)處理語(yǔ)言一種開源的通用計(jì)算機(jī)語(yǔ)言是一門編寫頁(yè)面的語(yǔ)言,底層使用語(yǔ)言實(shí)現(xiàn),使用的標(biāo)簽語(yǔ)法包裹代碼。通常跑在服務(wù)端,與服務(wù)器配合工作,負(fù)責(zé)把加工完返回給訪問(wèn)者。 PHP PHP是超文本預(yù)處理語(yǔ)言,一種開源的通用計(jì)算機(jī)語(yǔ)言. PHP 是一門編寫 web 頁(yè)面的語(yǔ)言,底層使用 C 語(yǔ)言實(shí)現(xiàn),使用 HTML 的標(biāo)簽語(yǔ)法包裹代碼。PHP 通常跑在服務(wù)端,與 web 服務(wù)器配合工作,負(fù)責(zé)把...
摘要:開發(fā)一個(gè)通用文件上傳包,發(fā)布到,并在中測(cè)試。一創(chuàng)建一個(gè)名新倉(cāng)庫(kù),并克隆至本地。九項(xiàng)目中使用我以中使用舉例其他本文通用上傳類由中修改本文首發(fā)琯琯博客,可前往瀏覽更多文章。 開發(fā)一個(gè) composer 通用文件上傳包,發(fā)布到 Packagist,并在 Laravel 中測(cè)試。 showImg(https://segmentfault.com/img/remote/1460000013948...
摘要:極致的插件機(jī)制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會(huì)對(duì)原來(lái)的系統(tǒng)產(chǎn)生影響強(qiáng)大的功能完全滿足各階段的需求,支持用戶多端訪問(wèn)后臺(tái)微信前臺(tái)等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺(tái)前端,微信,對(duì)內(nèi)接口,對(duì)外接口,不同的業(yè)務(wù),不同的設(shè)備,進(jìn)入不同的入口。 RageFrame 2.0 為二次開發(fā)而生,讓開發(fā)變得更簡(jiǎn)單 項(xiàng)目地址:https://github.com/jianyan74/... 前言 這...
摘要:極致的插件機(jī)制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會(huì)對(duì)原來(lái)的系統(tǒng)產(chǎn)生影響強(qiáng)大的功能完全滿足各階段的需求,支持用戶多端訪問(wèn)后臺(tái)微信前臺(tái)等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺(tái)前端,微信,對(duì)內(nèi)接口,對(duì)外接口,不同的業(yè)務(wù),不同的設(shè)備,進(jìn)入不同的入口。 RageFrame 2.0 為二次開發(fā)而生,讓開發(fā)變得更簡(jiǎn)單 項(xiàng)目地址:https://github.com/jianyan74/... 前言 這...
閱讀 846·2021-10-25 09:48
閱讀 617·2021-08-23 09:45
閱讀 2509·2019-08-30 15:53
閱讀 1765·2019-08-30 12:45
閱讀 608·2019-08-29 17:21
閱讀 3423·2019-08-27 10:56
閱讀 2557·2019-08-26 13:48
閱讀 704·2019-08-26 12:24