今天在公司無事,就搞了下文件上傳的東東,方便本身的學習,和從此的使用,目前只支持單文件上傳。下面是代碼部分,也能夠訪問個人 Gitee 或 Github,不想看代碼的童鞋能夠直接[下載]。。。(算了,討厭百度雲,若是有須要的話留言)代碼使用,使用方法請點擊php
<?php namespace E; class FileUpload { /** * @var $name 上傳文件標記名 */ protected $name = 'file'; /** * @var $ext 所容許的擴展名 */ protected $exts = []; /** * @var $file 上傳的文件資源 */ protected $file = null; /** * @var $upload_success 是否上傳成功標誌 */ protected $upload_success = false; /** * @var $max_size 上傳文件所容許的大小,單位爲 M */ protected $max_size = 2; /** * @var $error_code 錯誤碼 */ protected $error_code = 0; /** * @var $error_msg 錯誤信息 */ protected $error_msg = ''; /** * @var $file_ext 文件擴展名 */ protected $file_ext = ''; /** * @var $type 文件類型,默認爲任意類型 */ protected $type = 'file'; protected const ERR_OK = 0; protected const ERR_FILE_SIZE = 1; protected const ERR_FORM_SIZE = 2; protected const ERR_PARTIAL = 3; protected const ERR_NO_FILE = 4; protected const ERR_FILE_EXIST = 5; protected const ERR_NO_TMP_DIR = 6; protected const ERR_CANT_WRITE = 7; protected const ERR_FILE_TYPE = 8; /** * 配置上傳信息 * * @param array $arr * @return E\FileUpload */ public function config($arr) { foreach ($arr as $key => $val) { if (property_exists($this, $key)) { $this->$key = $val; } } return $this; } /** * 進行文件上傳操做 * * @return E\FileUpload */ public function upload() { $this->file = $this->getFile(); $this->file_ext = strrchr($this->file['name'], '.'); $this->upload_success = !($this->uploadError() || $this->overMaxSize() || $this->notAllowType()); return $this; } /** * 判斷文件是否上傳成功 * * @return boolean */ public function uploadSuccess() { return $this->upload_success; } /** * 保存已上傳的文件 * * @param string $path * @param string $file_name * * @return boolean */ public function save($path, $file_name = '') { if (!$this->uploadSuccess()) { return false; } // 判斷文件夾是否存在,若是不存在,新建一個文件夾 if (!is_dir($path)) { mkdir($path); } // 獲取文件名,不包含後綴 $file_name = $file_name ?: 'e_' . time() . mt_rand(10000, 99999); $file = rtrim($path, '/') . '/' . $file_name . $this->file_ext; // 判斷文件是否存在 if (file_exists($file)) { $this->error_code = self::ERR_FILE_EXIST; return false; } if (move_uploaded_file($this->file['tmp_name'], $file)) { return true; } // 文件未上傳成功,出現未知錯誤 $this->error_code = -1; return false; } /** * 返回錯誤碼 * * @return integer */ public function errorCode() { return $this->error_code; } /** * 返回錯誤信息 * * @return string */ public function errorMsg() { !$this->error_msg && $this->setErrorMsgByCode($this->error_code); return $this->error_msg; } /** * 獲取上傳文件 * * @return mixed */ protected function getFile() { return $_FILES[$this->name]; } /** * 判斷是否上傳錯誤 * * @return boolean */ protected function uploadError() { $this->error_code = $this->file['error']; return (bool)$this->file['error']; } /** * 根據錯誤代碼設置錯誤信息 * * @param int $code */ protected function setErrorMsgByCode($code) { $msg_arr = [ '', '上傳文件最大爲 ' . $this->getMaxSize() . 'M', '上傳文件過大', '文件只有部分被上傳', '沒有文件被上傳', '文件已存在', '文件丟失', '文件寫入失敗', '只能上傳' . implode(',', $this->exts) . '類型的文件' ]; $this->error_msg = $msg_arr[$code] ?? '未知錯誤'; } /** * 獲取上傳文件所限制的最大大小 * * @return int */ protected function getMaxSize() { return min($this->max_size, (int)ini_get('upload_max_filesize')); } /** * 判斷文件是否超出限制大小 * * @return boolean */ protected function overMaxSize() { if ($this->file['size'] > $this->getMaxSize() * 1024 * 1024 * 8) { $this->error_code = self::ERR_FILE_SIZE; return true; } return false; } /** * 經過類型獲取後綴名數組 * * @return array */ protected function getExtsByType() { $exts_arr = [ 'image' => ['jpg', 'jpeg', 'png', 'gif'], 'file' => [], 'zip' => ['zip', 'rar', '7z'] ]; return $exts_arr[$this->type] ?? []; } /** * 判斷是不是容許的類型 * * @return boolean */ protected function notAllowType() { $this->exts = $this->exts ?: $this->getExtsByType(); if (!$this->exts) return false; if (preg_match('/^\.' . implode('|', $this->exts) . '$/i', $this->file_ext)) { return false; } $this->error_code = self::ERR_FILE_TYPE; return true; } }
include 'FileUpload.class.php';
$uploader = new E\FileUpload();
$uploader->config([ 'name' => 'file', 'exts' => ['jpg'], 'type' => 'image', 'max_size' => 2, ]);
配置項的說明:git
配置項 | 說明 |
---|---|
name | 是 HTML 中 input 的 name,例如: <input type="file" name="file">,默認是 file |
exts | 所容許上傳的文件擴展名,類型爲數組,默認是任何類型的文件 |
type | 上傳文件類型,能夠經過設置 type 屬性,設置容許上傳類型,默認爲 file,目前可選類型有:file 所有文件類型,image 圖片類型, zip 壓縮包,注意:exts優先級高於 type,即若是設置了 type 爲 file,exts 爲 ['jpg'] 時,也仍是隻能上傳 jpg 類型的文件的 |
max_size | 所容許上傳的大小,單位爲 M,默認爲 2M |
$uploader->upload();
$uploader->save('./uploads/', 'test')
save 方法的返回值是一個布爾值,上傳成功返回 true,失敗返回 false,能夠根據返回的狀態進行相應的操做,若是失敗,能夠使用 errorCode()
方法獲取錯誤代碼,使用 errorMsg()
方法獲取錯誤信息。github
save 方法的第一個參數爲必填參數,是要保存的路徑,第二個參數是文件名,可選,若是不填,則會自動生成,生成規則: e_ 鏈接上當前時間的時間戳再鏈接5位隨機數數組
也能夠使用鏈式操做:學習
$uploader->upload()->save('./uploads/', 'test');
錯誤碼 | 說明 |
---|---|
0 | 無錯誤 |
1 | 上傳文件超出限制大小 |
2 | 上傳文件超出 form 表單所設置的 MAX_FILE_SIZE,也是文件過大 |
3 | 文件只有部分被上傳 |
4 | 沒有文件被上傳 |
5 | 存在同名文件 |
6 | 文件丟失 |
7 | 文件寫入失敗 |
8 | 上傳的文件類型不被容許 |
-1 | 未知錯誤 |