標籤:thinkphp5
/** * 檢測上傳檔案 * @param array $rule 驗證規則 * @return bool */ public function check($rule = []) {// 檢測 上傳 檔案 $rule = $rule ?: $this->validate;// rule 規則 擷取 /* 檢查檔案大小 */ if (isset($rule[‘size‘]) && !$this->checkSize($rule[‘size‘])) {// 檔案大小 $this->error = ‘上傳檔案大小不符!‘; return false; } /* 檢查檔案Mime類型 */ if (isset($rule[‘type‘]) && !$this->checkMime($rule[‘type‘])) {// 檔案類型 $this->error = ‘上傳檔案MIME類型不允許!‘; return false; } /* 檢查檔案尾碼 */ if (isset($rule[‘ext‘]) && !$this->checkExt($rule[‘ext‘])) {// 檔案尾碼 $this->error = ‘上傳檔案尾碼不允許‘; return false; } /* 檢查影像檔 */ if (!$this->checkImg()){ // 是否為圖片 $this->error = ‘非法影像檔!‘; return false; } return true; } /** * 檢測上傳檔案尾碼 * @param array|string $ext 允許尾碼 * @return bool */ public function checkExt($ext) { if (is_string($ext)) { $ext = explode(‘,‘, $ext);// 擷取許可檔案 尾碼 } $extension = strtolower(pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION)); if (!in_array($extension, $ext)) {// 判斷是否存在 功能內 return false; } return true; } /** * 檢測影像檔 * @return bool */ public function checkImg()// 圖片檢測 { $extension = strtolower(pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION)); /* 對影像檔進行嚴格檢測 */ if (in_array($extension, [‘gif‘, ‘jpg‘, ‘jpeg‘, ‘bmp‘, ‘png‘, ‘swf‘]) && !in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6])) { return false; } return true; } // 判斷映像類型 protected function getImageType($image)// 圖片類型檢測 { if (function_exists(‘exif_imagetype‘)) { return exif_imagetype($image); } else { $info = getimagesize($image); return $info[2]; } } /** * 檢測上傳檔案大小 * @param integer $size 最大大小 * @return bool */ public function checkSize($size) { if ($this->getSize() > $size) {// 檔案大小 return false; } return true; } /** * 檢測上傳檔案類型 * @param array|string $mime 允許類型 * @return bool */ public function checkMime($mime) { if (is_string($mime)) { $mime = explode(‘,‘, $mime); } if (!in_array(strtolower($this->getMime()), $mime)) {// 檔案類型 許可 return false; } return true; } /** * 移動檔案 * @param string $path 儲存路徑 * @param string|bool $savename 儲存的檔案名稱 預設自動產生 * @param boolean $replace 同名檔案是否覆蓋 * @return false|SplFileInfo false-失敗 否則返回SplFileInfo執行個體 */ public function move($path, $savename = true, $replace = true) {// 儲存 路徑 報錯名字 // 檔案上傳失敗,捕獲錯誤碼 if (!empty($this->info[‘error‘])) {// 捕獲 錯誤資訊代碼 $this->error($this->info[‘error‘]); return false; } // 檢測合法性 if (!$this->isValid()) {// 合法性 $this->error = ‘非法上傳檔案‘; return false; } // 驗證上傳 if (!$this->check()) {// 驗證上傳 return false; } $path = rtrim($path, DS) . DS;// 刪除 右側 分隔字元 // 檔案儲存命名規則 $saveName = $this->buildSaveName($savename);// 擷取 儲存的檔案名稱 $filename = $path . $saveName;// 組建檔案名稱 // 檢測目錄 if (false === $this->checkPath(dirname($filename))) {// 檢測 目錄 return false; } /* 不覆蓋同名檔案 */ if (!$replace && is_file($filename)) {// 同名檔案 覆蓋 $this->error = ‘存在同名檔案‘ . $filename; return false; } /* 移動檔案 */ if ($this->isTest) { rename($this->filename, $filename);// 移動檔案 } elseif (!move_uploaded_file($this->filename, $filename)) {// 普通上傳檔案 $this->error = ‘檔案上傳儲存錯誤!‘; return false; } // 返回 File對象執行個體 $file = new self($filename);// 經過一系列的報錯 處理之後 $file->setSaveName($saveName);// 設定 報錯檔案 $file->setUploadInfo($this->info);// 儲存 資訊 到 資訊中 return $file;// 返回 執行個體化 控制代碼 } /** * 擷取儲存檔案名稱 * @param string|bool $savename 儲存的檔案名稱 預設自動產生 * @return string */ protected function buildSaveName($savename) { if (true === $savename) { // 自動組建檔案名 if ($this->rule instanceof \Closure) { $savename = call_user_func_array($this->rule, [$this]);// 擷取 檔案名稱 } else { switch ($this->rule) { case ‘md5‘: $md5 = md5_file($this->filename); $savename = substr($md5, 0, 2) . DS . substr($md5, 2);// md5 方式的檔案名稱 break; case ‘sha1‘: $sha1 = sha1_file($this->filename); $savename = substr($sha1, 0, 2) . DS . substr($sha1, 2);// sha1 方式檔案名稱 break; case ‘date‘: $savename = date(‘Ymd‘) . DS . md5(microtime(true));// 日期方式 檔案名稱 break; default: $savename = call_user_func($this->rule);// 調用規則函數 組建檔案名 } } } elseif (‘‘ === $savename) { $savename = $this->getInfo(‘name‘);// 空 } if (!strpos($savename, ‘.‘)) { $savename .= ‘.‘ . pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION);// 有自己指定的檔案名稱 } return $savename; } /** * 擷取錯誤碼資訊 * @param int $errorNo 錯誤號碼 */ private function error($errorNo)// 錯誤資訊翻譯 { switch ($errorNo) { case 1: case 2: $this->error = ‘上傳檔案大小超過了最大值!‘; break; case 3: $this->error = ‘檔案只有部分被上傳!‘; break; case 4: $this->error = ‘沒有檔案被上傳!‘; break; case 6: $this->error = ‘找不到臨時檔案夾!‘; break; case 7: $this->error = ‘檔案寫入失敗!‘; break; default: $this->error = ‘未知上傳錯誤!‘; } } /** * 擷取錯誤資訊 * @return mixed */ public function getError()// 返回錯誤資訊 { return $this->error; }}
本文出自 “專註php 群號:414194301” 部落格,請務必保留此出處http://jingshanls.blog.51cto.com/3357095/1877990
[李景山php]每天TP5-20170105|thinkphp5-File.php-2