程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP設計超級好用的文件上傳處理類一 (37),

PHP設計超級好用的文件上傳處理類一 (37),

編輯:關於PHP編程

PHP設計超級好用的文件上傳處理類一 (37),


<?php
    class FileUpload {
        private $filepath;     //指定上傳文件保存的路徑
        private $allowtype=array('gif', 'jpg', 'png', 'jpeg');  //充許上傳文件的類型
        private $maxsize=1000000;  //允上傳文件的最大長度 1M
        private $israndname=true;  //是否隨機重命名, 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="上傳文件<font color='red'>{$this->originName}</font>時出錯:";

            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.'<br>';
        }
    
        //用來檢查文件上傳路徑
        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; $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{
                        $error[]=$this->getError();
                        $return=false;
                    }

                    if(!$return)
                        $this->setFiles();
                }

                if($return){
                    $fileNames=array();

                    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;
                            }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()){
                                return true;
                            }else{
                                $return=false;
                            }
                                
                        }else{
                            $return=false;
                        }    
                    }else{
                        $return=false;
                    }
                    
                    

                    if(!$return)
                        $this->errorMess=$this->getError();


                    return $return;
            }            
        }

        private function copyFile(){
            if(!$this->errorNum){
                $filepath=rtrim($this->filepath, '/').'/';
                $filepath.=$this->newFileName;

                if(@move_uploaded_file($this->tmpFileName, $filepath))    {
                    return true;
                }else{
                    $this->setOption('errorNum', -3);
                    return false;
                }
                    
            }else{
                return false;
            }
        }

        //設置和$_FILES有關的內容
        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);
            $arrStr=explode('.', $name); 
            $this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
            $this->setOption('fileSize', $size);    

            return true;
        }    

        //用於獲取上傳後文件的文件名
        function getNewFileName(){
            return $this->newFileName;
        }
        //上傳如果失敗,則調用這個方法,就可以查看錯誤報告
        function getErrorMsg() {
            return $this->errorMess;
        }
    }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved