- class FileUpload {
- private $filepath; //指定上傳檔案儲存的路徑
- private $allowtype=array('gif', 'jpg', 'png' , 'jpeg'); //充填上傳檔案的類型
- private $maxsize=1000000; //不允上傳檔案的最大長度1M
- private $israndname=true; //是否隨機重新命名, false不允隨機,使用原始檔案名稱
- private $originName; //來源檔案名稱
- private $tmpFileName; //臨時檔案名稱
- private $fileType; //檔案類型
- private $fileSize; //檔案大小
- private $newFileName; //新檔名
- private $errorNum=0; //錯誤編號
- private $errorMess=""; //用來提供錯誤回報
-
- / /用於對上傳檔案初步化
- //1. 指定上傳路徑, 2,充許可的類型, 3,限制大小, 4,是否使用隨機檔案名稱
- //讓使用者可以不用按位置傳參數,後面參數給值不用將前幾個參數也提供值
- function __construct($options=array()){
- foreach($options as $key=>$val){
- $ key=strtolower($key);
- //查看使用者參數中陣列的下標是否和成員屬性名稱相同
- if(!in_array($key,get_class_vars(get_class($this)))){
- continue;
- }
- $this->setOption($key, $val);
- }
- }
- private function getError(){
- $str="上傳文件{$this->originName}時發生錯誤:";
- switch($this->errorNum){
- case 4: $str .= "沒有檔案被上傳"; break;
- case 3: $str .= "檔案只被部分上傳"; break;
- case 2: $str .= "上傳檔案超過了HTML表單中MAX_FILE_SIZE選項指定的值"; break;
- case 1: $str .= "上傳檔案超過了php.ini 中upload_max_filesize選項的值"; break;
- case -1: $str .= "最後充份的型別"; break;
- case -2: $str .= "檔案過大,上傳檔案不能超過{$this->maxSize}個字節"; break;
- case -3: $str .= "上傳失敗"; break;
- case -4: $str .= "建立存放上傳檔案目錄失敗,請重新指定上傳目錄"; break;
- case -5: $str .= "必須指定上傳檔案的路徑"; break;
- default: $str .= "末知錯誤";
- }
- return $str.'
';
- }
- //用來檢查檔案上傳路徑
- private function checkFilePath(){
- if(empty($this->filepath)) {
- $this->setOption('errorNum', -5);
- return false;
- }
- if(!file_exists($this->filepath) || !is_writable($this->filepath)){
- if(!@mkdir($this->filepath, 0755)){
- $ this->setOption('errorNum', -4);
- return false;
- }
- }
- return true;
- }
- //用來檢查檔案上傳的大小
- private function checkFileSize() {
- if($this->fileSize > $this->maxsize){
- $this->setOPtion('errorNum', '-2');
- return false ;
- }else{
- return true;
- }
- }
- //用於檢查檔案上傳類型
- private function checkFileType() {
- if(in_array(strtolower( $this->fileType), $this->allowtype)) {
- return true;
- }else{
- $this->setOption('errorNum', -1);
- return false;
- }
- }
- //設定上傳後的檔案名稱
- private function setNewFileName(){
- if($this->israndname){
- $this->setOption(' newFileName', $this->proRandName());
- } else {
- $this->setOption('newFileName', $this->originName);
- }
- }
-
- //設定隨機檔案名稱
- private function proRandName(){
- $fileName=date("YmdHis").rand(100,999);
- return $fileName.'.'.$this-> fileType;
- }
- private function setOption($key, $val){
- $this->$key=$val;
- }
- //用來上傳一個檔案
- function uploadFile($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();
- for($i=0; $iif($this->setFiles($name[$i] , $tmp_name[$i], $size[$i], $error[$i])){
- if(!$this->checkFileSize() || !$this->checkFileType()){
- $errors[]=$this->getError();
- $return=false;
- }
- }else{
- $error[]=$this->getError();
- $return=false;
- }
- if(!$return)
- $this->setFiles();
- }
- if($return){
- $fileNames= array();
- for($i=0; $iif($this->setFiles($name[$i], $tmp_name[$i ], $size[$i], $error[$i])){
- $this->setNewFileName();
- if(!$this->copyFile()){
- $errors= $this->getError();
- $return=false;
- }else{
- $fileNames[]=$this->newFileName;
- }
- }
- }
- $this->newFileName=$fileNames;
- }
- $this->errorMess=$errors;
- return $return;
- } else {
- if($this->setFiles($name, $tmp_name, $size, $error) ){
- if($this->checkFileSize() && $this->checkFileType()){
- $this->setNewFileName();
- if($this->copyFile( )){
- 回傳true;
- }else{
- $return=false;
- }
- }else{
- $return=false;
- }
- }else {$return =false;
- }
- if(!$return)
- $this->errorMess=$this->getError();
- 回傳$return;
- }
- }
- 不行函數copyFile(){
- if(!$this->errorNum){
- $filepath=rtrim($this->filepath, '/').' /';
- $filepath.=$this->newFileName;
- if(@move_uploaded_file($this->tmpFileName, $filepath)) {
- 回傳 true;
- }else{
- $this->setOption('errorNum', -3);
- 回傳false;
- }
- }else{
- 回傳false;
- }
- }
- //設定和$_FILES相關的內容
- private function setFiles($name="", $tmp_name='', $size=0, $error=0){
- $this->setOption(' errorNum', $錯誤);
- if($error){
- 回傳false;
- }
- $this->setOption('originName', $name);
- $this->setOption('tmpFileName ', $tmp_name);
- $arrStr=explode('.', $name);
- $this->setOption('fileType', strtolower($arrStr[count($ arrStr)-1])) ;
- $this->setOption('fileSize', $size);
- return true;
- }
- //用於取得上傳後檔案的檔案名稱
- function NewFileName(){getNewFileName(){
- return $this->newFileName;
- }
- / 上傳如果失敗,則呼叫這個方法,就可以查看錯誤報告
- function getErrorMsg() {
- return $this->errorMess;
- }
- }
複製程式碼
|