[PHP文件上傳下載]⑥--面向對象文件上傳

upload.class.func

<?php

class upload
{
    protected $fileName;
    protected $maxSize;
    protected $allowMime;
    protected $allowExt;
    protected $uploadPath;
    protected $imgFlag;
    protected $fileInfo;
    protected $error;
    protected $ext;
    protected $destination;
    private $uniName;

    /**
     * upload constructor.
     * @param string $fileName
     * @param string $uploadPath
     * @param bool $imgFlag
     * @param int $maxSize
     * @param array $allowExt
     * @param array $allowMime
     */
    public function __construct($fileName = 'myFile', $uploadPath = './uploads', $imgFlag = true, $maxSize = 5242880,
                                $allowExt = array('jpeg', 'jpg', 'png', 'gif'),
                                $allowMime = array('image/jpeg', 'image/png', 'image/gif'))
    {
        $this->fileName = $fileName;
        $this->maxSize = $maxSize;
        $this->allowMime = $allowMime;
        $this->allowExt = $allowExt;
        $this->uploadPath = $uploadPath;
        $this->imgFlag = $imgFlag;
        $this->fileInfo = $_FILES[$this->fileName];
    }

    /**
     * 檢測上傳文件是否出錯
     * @return bool
     */
    protected function checkError()
    {
        if (!is_null($this->fileInfo)) {
            if ($this->fileInfo['error'] > 0) {
                switch ($this->fileInfo['error']) {
                    case 1:
                        $this->error = '超過了PHP配置文件中upload_max_filesize選項的值';
                        break;
                    case 2:
                        $this->error = '超過了表單中MAX_FILE_SIZE設置的值';
                        break;
                    case 3:
                        $this->error = '文件部分被上傳';
                        break;
                    case 4:
                        $this->error = "沒有選擇上傳文件";
                        break;
                    case 6:
                        $this->error = "沒有找到臨時目錄";
                        break;
                    case 7:
                        $this->error = "文件不可寫";
                        break;
                    case 8:
                        $this->error = "由于PHP的擴展程序中斷文件上傳";
                        break;
                }
                return false;
            } else {
                return true;
            }
        } else {
            $this->error = "文件上傳出錯";
            return false;
        }
    }

    /**
     * 檢測上傳文件的大小
     * @return bool
     */
    protected
    function checkSize()
    {
        if ($this->fileInfo['size'] > $this->maxSize) {
            $this->error = "上傳文件過大";
            return false;
        }
        return true;
    }


    /**
     * 檢測擴展名
     * @return bool
     */
    protected
    function checkExt()
    {
        $this->ext = strtolower(pathinfo($this->fileInfo['name'], PATHINFO_EXTENSION));
        if (!in_array($this->ext, $this->allowExt)) {
            $this->error = '不允許的擴展名';
            return false;
        }
        return true;
    }

    /**
     * 檢測文件的類型
     * @return bool
     */
    protected
    function checkMime()
    {
        if (!in_array($this->fileInfo['type'], $this->allowMime)) {
            $this->error = '不允許的文件類型';
            return false;
        }
        return true;
    }

    /**
     * 檢測是否是真實圖片
     * @return bool
     */
    protected
    function checkTrueImg()
    {
        if ($this->imgFlag) {
            if (!@getimagesize($this->fileInfo['tmp_name'])) {
                $this->error = "不是真實圖片";
                return false;
            }
            return true;
        }
    }

    /**
     * 檢測是否通過HTTP POST方式上傳的
     * @return bool
     */
    protected
    function checkHTTPPost()
    {
        if (!is_uploaded_file($this->fileInfo['tmp_name'])) {
            $this->error = "文件不是通過HTTP POST方式上傳的";
            return false;
        }
        return true;
    }

    /**
     * 顯示錯誤
     */
    protected
    function showError()
    {
        exit('<span style="color:red">' . $this->error . '</span>');
    }

    /**
     * 檢測目錄不存在則創(chuàng)建
     */
    protected
    function checkUploadPath()
    {
        if (!file_exists($this->uploadPath)) {
            mkdir($this->uploadPath, 0777, true);
        }
    }

    /**
     * 產(chǎn)生唯一字符串
     * @return string
     */
    protected
    function getUniName()
    {
        return md5(uniqid(microtime(true), true));
    }

    /**
     *上傳文件
     */
    public
    function uploadFile()
    {
        if ($this->checkError() && $this->checkExt()
            && $this->checkMime() && $this->checkTrueImg()
            && $this->checkHTTPPOST()
        ) {
            $this->checkUploadPath();
            $this->uniName = $this->getUniname();
            $this->destination = $this->uploadPath . "/" . $this->uniName . '.' . $this->ext;
            if (@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)) {
                return $this->destination;
            } else {
                $this->error = "文件移動失敗";
                $this->showError();
            }
        } else {
            $this->showError();
        }
    }
}

test.php

<html>
<head><title></title></head>
<body>
<form action="doAction.php" method="post" enctype="multipart/form-data">
    請選擇您要上傳的文件:<input type="file" name="myFile1"><br/>
    <input type="submit" value="上傳文件">
</form>
</body>
</html>

doAction.php

<?php
header("content-type:text/html;charset=utf-8");
require_once 'upload.class.php';
$upload = new upload('myFile1','imooc');
$dest = $upload->uploadFile();
echo $dest;
?>
Paste_Image.png
Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末远荠,一起剝皮案震驚了整個濱河市前联,隨后出現(xiàn)的幾起案子祸泪,更是在濱河造成了極大的恐慌岸裙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旷偿,死亡現(xiàn)場離奇詭異烹俗,居然都是意外死亡爆侣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門幢妄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兔仰,“玉大人,你說我怎么就攤上這事磁浇≌悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵置吓,是天一觀的道長无虚。 經(jīng)常有香客問我,道長衍锚,這世上最難降的妖魔是什么友题? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮戴质,結果婚禮上度宦,老公的妹妹穿的比我還像新娘。我一直安慰自己告匠,他們只是感情好戈抄,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著后专,像睡著了一般划鸽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戚哎,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天裸诽,我揣著相機與錄音,去河邊找鬼型凳。 笑死丈冬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的甘畅。 我是一名探鬼主播埂蕊,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疏唾!你這毒婦竟也來了蓄氧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤荸实,失蹤者是張志新(化名)和其女友劉穎匀们,沒想到半個月后缴淋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體准给,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡泄朴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了露氮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祖灰。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畔规,靈堂內(nèi)的尸體忽然破棺而出局扶,到底是詐尸還是另有隱情,我是刑警寧澤叁扫,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布三妈,位于F島的核電站,受9級特大地震影響莫绣,放射性物質發(fā)生泄漏畴蒲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一对室、第九天 我趴在偏房一處隱蔽的房頂上張望模燥。 院中可真熱鬧,春花似錦掩宜、人聲如沸蔫骂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辽旋。三九已至,卻和暖如春慧瘤,著一層夾襖步出監(jiān)牢的瞬間戴已,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工锅减, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糖儡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓怔匣,卻偏偏與公主長得像握联,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子每瞒,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容