PHP設計的超強大的文件上傳類(單文件上傳)

form.htmlphp

<!DOCTYPE html>
<html>
<head>
    <title>文件上傳</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    <input type="file" name="spic"><br>
    <input type="submit" name="sub" value="上傳文件">
        
    </form>
</body>
</html>

upload.phphtml

<?php
include "./FileUpload.class.php";

$up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt','doc','pig','gif','php','jpg'),'filePath'=>'./upload/','maxSize'=>2000000));


if($up->uploadFile('spic')){
    echo $up->getNewFileName();
}else{
    echo $up->getErrorMsg();
}
//var_dump($up);
?>

FileUpload.class.php數組

<?php
class FileUpload{
    //上傳文件保存的路徑
    private $filePath;
    //容許上傳文件的類型
    private $allowType=array('gif','jpg','png','jpeg');
    //上傳文件的最大尺寸  1M
    private $maxSize=1000000;   
    //是不是隨機文件名
    private $isRandName=true;
    //原文件名稱
    private $originName;
    //臨時文件名稱
    private $tmpFileName;
    //文件類型
    private $fileType;
    //文件的大小
    private $fileSize;
    //新文件名
    private $newFileName;
    //錯誤號
    private $errorNum;
    //用來提供錯誤報告
    private $errorMess;



    //用於對上傳文件的初始化
    //1.指定上傳的路徑。2.容許的類型。3.限制大小。4.是否使用隨機文件名
    //讓用戶能夠不用按位置傳參數,後面參數給值不用將前幾個參數也提供值
    function __construct($options=array()){
        /*$this->filePath=$filePath;
        $this->allowType=$allowType;
        $this->maxSize=$maxSize;
        $isRandName=$isRandName;*/
        foreach ($options as $key => $value) {
            //將傳過來的$key全轉變成小寫
            //$key=strtolower($key);
            //查看用戶參數中數組的下標是否和成員屬性名相同
            if(!in_array($key,get_class_vars(get_class($this)))){
                continue;
            }
            $this->setOption($key,$value);
        }
        /*print_r(get_class_vars(get_class($this)));*/

    }

    private function setOption($key,$value){
        $this->$key=$value;
    }

    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.="文件過大,上傳文件不能超過{$thi->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)){
                $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($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("Y").date("m").date("d").date("H").date("i").date("s").rand(100,999).".";    //隨機文件名
        return $fileName.".".$this->fileType;
    }


    //用來上傳一個文件
    function uploadFile($fileFied){
        $return=true;
        //檢查文件上傳路徑
        if(!$this->checkFilePath()){
            $this->errorMess=$this->getError();
            return false;
        }
        $name=$_FILES[$fileFied]['name'];
        $tmp_name=$_FILES[$fileFied]['tmp_name'];
        $size=$_FILES[$fileFied]['size'];
        $error=$_FILES[$fileFied]['error'];

        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==0){
            //不管上傳的路徑是否有「/」都加上「/」
            $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',$arrStr[count($arrStr)-1]);
        $this->setOption('fileSize',$size);
        return true;
    }

    //用於獲取上傳後文件的文件名
    function getNewFileName(){
        return $this->newFileName;
    }

    //上傳若是失敗,則調用這個方法,就能夠查看錯誤報告
    function getErrorMsg(){
        return $this->errorMess;
    }
}
?>
相關文章
相關標籤/搜索