<?php /** *================================================================== * upload.class.php 文件上傳類,實現文件上傳功能 * @author 王超平 * @copyright 傳智播客PHP學院 2006-2014 * @version 1.0 * 2013年3月27日0:37:15 *================================================================== */ class Upload{ private $path; //文件上傳目錄 private $max_size; //上傳文件大小限制 private $errno; //錯誤信息號 private $mime = array('image/jpeg','image/png','image/gif');//容許上傳的文件類型 /** * 構造函數, * @access public * @param $path string 上傳的路徑 */ public function __construct($path = UPLOAD_PATH ){ $this->path = $path; $this->max_size = 1000000; } /** * 文件上傳的方法,分目錄存放文件 * @access public * @param $file array 包含上傳文件信息的數組 * @return mixed 成功返回上傳的文件名,失敗返回false */ public function up($file){ //判斷文件是不是經過 HTTP POST 上傳,防止惡意欺騙 /* if (! is_uploaded_file($file['tmp_name'])) { $this->errno = 5; //設置錯誤信息號爲5,表示非法上傳 return false; } */ //判斷是否從瀏覽器端成功上傳到服務器端 if ($file['error'] == 0) { # 上傳到臨時文件夾成功,對臨時文件進行處理 //上傳類型判斷 if (!in_array($file['type'], $this->mime)) { # 類型不對 $this->errno = -1; return false; } //判斷文件大小 if ($file['size'] > $this->max_size) { # 大小超出配置文件的中的上傳限制 $this->errno = -2; return false; } //獲取存放上傳文件的目錄 $sub_path = date('Ymd').'/'; if (!is_dir($this->path . $sub_path)) { # 不存在該目錄,建立之 mkdir($this->path . $sub_path); } //文件重命名,由當前日期 + 隨機數 + 後綴名 $file_name = date('YmdHis').uniqid().strrchr($file['name'], '.'); //準備就緒了,開始上傳 if (move_uploaded_file($file['tmp_name'], $this->path . $sub_path . $file_name)) { # 移動成功 return $sub_path . $file_name; } else { # 移動失敗 $this->errno = -3; return false; } } else { # 上傳到臨時文件夾失敗,根據其錯誤號設置錯誤號 $this->errno = $file['error']; return false; } } /** * 多文件上傳方法 * @access public * @param $file array 包含上傳文件信息的數組,是一個二維數組 * @return array 成功返回上傳的文件名構成的數組, ?若是有失敗的則不太好處理了 */ public function multiUp($files){ //在多文件上傳時,上傳文件信息 又是一個多維數組,如$_FILES['userfile']['name'][0],$_FILES['userfile']['name'][1] //咱們只須要遍歷該數組,獲得每一個上傳文件的信息,依次調用up方法便可 foreach ($files['name'] as $key => $value) { # code... $file['name'] = $files['name'][$key]; $file['type'] = $files['type'][$key]; $file['tmp_name'] = $files['tmp_name'][$key]; $file['error'] = $files['error'][$key]; $file['size'] = $files['size'][$key]; //調用up方法,完成上傳 $filename[] = $this->up($file); } return $filename; } /** * 獲取錯誤信息,根據錯誤號獲取相應的錯誤提示 * @access public * @return string 返回錯誤信息 */ public function error(){ switch ($this->errno) { case -1: return '請檢查你的文件類型,目前支持的類型有'.implode(',', $this->mime); break; case -2: return '文件超出系統規定的大小,最大不能超過'. $this->max_size; break; case -3: return '文件移動失敗'; break; case 1: return '上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值,其大小爲'.ini_get('upload_max_filesize'); break; case 2: return '上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值,其大小爲' . $_POST['MAX_FILE_SIZE']; break; case 3: return '文件只有部分被上傳'; break; case 4: return '沒有文件被上傳'; break; case 5: return '非法上傳'; break; case 6: return '找不到臨時文件夾'; break; case 7: return '文件寫入臨時文件夾失敗'; break; default: return '未知錯誤,靈異事件'; break; } } } /* 測試代碼:單文件上傳 <form method='POST' action='upload.php' enctype='multipart/form-data'> <input type = 'hidden' name='MAX_FILE_SIZE' value = '2000000' /> <input type = 'file' name = 'picture' /> <input type = 'submit' value = '上傳' /> </form> $upload = new upload; if($file_name = $upload->up($_FILES['picture'])){ echo '上傳成功,文件名爲', $file_name; } else { echo '上傳失敗,錯誤信息爲:',$upload->error(); } */ /* 測試代碼:多文件上傳 <form action="test.php" method="POST" enctype="multipart/form-data"> <label for="上傳圖片"></label> <input type="file" name='logos[]' /> <br /> <label for="上傳圖片"></label> <input type="file" name='logos[]' /> <br /> <label for="上傳圖片"></label> <input type="file" name='logos[]' /> <br /> <input type="submit" name='肯定' /> </form> $upload = new Upload(); $filename = $upload->multiUp($_FILES['logos']); echo '<pre>'; var_dump($filename); echo '<pre>'; */