PHP通用文件上傳類

<?phpphp

/**
 *  PHP通用文件上傳類
 *
 *  支持單文件和多文件上傳
*/

class FileUpload{

    //要配置的內容
    private $path = "./uploads";
    private $allowtype = array('jpg', 'gif', 'png');
    private $maxsize = 1000000;
    private $israndname = true;

    private $originName;
    private $tmpFileName;
    private $fileType;
    private $fileSize;
    private $newFileName;
    private $errorNum = 0;
    private $errorMess = "";

    /**
     * 用於設置成員屬性($path, $allowtype, $maxsize, $israndname)
     * 能夠經過連貫操做一次設置多個屬性值
     * @param $key  成員屬性(不區分大小寫)
     * @param $val  爲成員屬性設置的值
     * @return object 返回本身對象$this, 能夠用於連貫操做
     */
    function set($key, $val){
        $key = strtolower($key);
        if (array_key_exists($key, get_class_vars(get_class($this)))){
            $this->setOption($key, $val);
        }
        return $this;
    }

    /**
     * 調用該方法上傳文件
     * Enter description here ...
     * @param $fileField    上傳文件的表單名稱
     */
    function upload($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{
                    $errors[] = $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;
                        }
                        $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;

    }

    //獲取上傳後的文件名稱
    public function getFileName(){
        return $this->newFileName;
    }

    //上傳失敗後,調用該方法則返回,上傳出錯信息
    public function getErrorMsg(){
        return $this->errorMess;
    }

    //設置上傳出錯信息
    public 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>";
    }

    //設置和$_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);
        $aryStr = explode(".", $name);
        $this->setOption("fileType", strtolower($aryStr[count($aryStr)-1]));
        $this->setOption("fileSize", $size);
        return true;
    }


    //爲單個成員屬性設置值
    private function setOption($key, $val){
        $this->$key = $val;
    }

    //設置上傳後的文件名稱
    private function setNewFileName(){
        if ($this->israndname) {
            $this->setOption('newFileName', $this->proRandName());
        }else{
            $this->setOption('newFileName', $this->originName);
        }
    }

    //檢查上傳的文件是不是合法的類型
    private function checkFileType(){
        if (in_array(strtolower($this->fileType), $this->allowtype)) {
            return true;
        }else{
            $this->setOption('errorNum', -1);
            return false;
        }
    }


    //檢查上傳的文件是不是容許的大小
    private function checkFileSize(){
        if ($this->fileSize > $this->maxsize) {
            $this->setOption('errorNum', -5);
            return false;
        }else{
            return true;
        }
    }

    //檢查是否有存放上傳文件的目錄
    private function checkFilePath(){
        if (empty($this->path)) {
            $this->setOption('errorNum', -5);
            return false;
        }
        if (!file_exists($this->path) || !is_writable($this->path)) {
            if (!@mkdir($this->path, 0755)) {
                $this->setOption('errorNum', -4);
                return false;
            }
        }
        return true;
    }

    //設置隨機文件名
    private function proRandName(){
        $fileName = date('YmdHis')."_".rand(100,999);
        return $fileName.'.'.$this->fileType;
    }

    //複製上傳文件到指定的位置
    private function copyFile(){
        if (!$this->errorNum) {
            $path = rtrim($this->path, '/').'/';
            $path.= $this->newFileName;
            if (@move_uploaded_file($this->tmpFileName, $path)) {
                return true;
            }else{
                $this->setOption('errorNum', -3);
                return false;
            }
        }else{
            return false;
        }
    }

}

抄來的文件上傳來,做爲鞏固面向對象知識。數組

總結:
 1. 定義成員屬性,要輸入的信息
 2. 定義構造方法或配置方法(set()實現連貫操做)
 3. 定義主方法(上傳方法upload())
  1. 檢查文件路徑是否合法
  2. 將文件上傳的信息取出賦給變量
  3. 若是是多個文件夾上傳則$file['name']會是數組
   1.先循環檢查文件合法性
   2.再上傳
  4. 定義各類輔助方法
相關文章
相關標籤/搜索