[李景山php]每天TP5-20170105|thinkphp5-File.php-2

來源:互聯網
上載者:User

標籤:thinkphp5

    /**     * 檢測上傳檔案     * @param  array   $rule    驗證規則     * @return bool     */    public function check($rule = [])    {// 檢測 上傳 檔案        $rule = $rule ?: $this->validate;// rule 規則 擷取        /* 檢查檔案大小 */        if (isset($rule[‘size‘]) && !$this->checkSize($rule[‘size‘])) {// 檔案大小            $this->error = ‘上傳檔案大小不符!‘;            return false;        }        /* 檢查檔案Mime類型 */        if (isset($rule[‘type‘]) && !$this->checkMime($rule[‘type‘])) {// 檔案類型            $this->error = ‘上傳檔案MIME類型不允許!‘;            return false;        }        /* 檢查檔案尾碼 */        if (isset($rule[‘ext‘]) && !$this->checkExt($rule[‘ext‘])) {// 檔案尾碼            $this->error = ‘上傳檔案尾碼不允許‘;            return false;        }        /* 檢查影像檔 */        if (!$this->checkImg()){ // 是否為圖片            $this->error = ‘非法影像檔!‘;            return false;        }        return true;    }    /**     * 檢測上傳檔案尾碼     * @param  array|string   $ext    允許尾碼     * @return bool     */    public function checkExt($ext)    {        if (is_string($ext)) {            $ext = explode(‘,‘, $ext);// 擷取許可檔案 尾碼        }        $extension = strtolower(pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION));        if (!in_array($extension, $ext)) {// 判斷是否存在 功能內            return false;        }        return true;    }    /**     * 檢測影像檔     * @return bool     */    public function checkImg()// 圖片檢測    {        $extension = strtolower(pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION));        /* 對影像檔進行嚴格檢測 */        if (in_array($extension, [‘gif‘, ‘jpg‘, ‘jpeg‘, ‘bmp‘, ‘png‘, ‘swf‘]) && !in_array($this->getImageType($this->filename), [1, 2, 3, 4, 6])) {            return false;        }        return true;    }    // 判斷映像類型    protected function getImageType($image)// 圖片類型檢測    {        if (function_exists(‘exif_imagetype‘)) {            return exif_imagetype($image);        } else {            $info = getimagesize($image);            return $info[2];        }    }    /**     * 檢測上傳檔案大小     * @param  integer   $size    最大大小     * @return bool     */    public function checkSize($size)    {        if ($this->getSize() > $size) {// 檔案大小            return false;        }        return true;    }    /**     * 檢測上傳檔案類型     * @param  array|string   $mime    允許類型     * @return bool     */    public function checkMime($mime)    {        if (is_string($mime)) {            $mime = explode(‘,‘, $mime);        }        if (!in_array(strtolower($this->getMime()), $mime)) {// 檔案類型 許可            return false;        }        return true;    }    /**     * 移動檔案     * @param  string           $path    儲存路徑     * @param  string|bool      $savename    儲存的檔案名稱 預設自動產生     * @param  boolean          $replace 同名檔案是否覆蓋     * @return false|SplFileInfo false-失敗 否則返回SplFileInfo執行個體     */    public function move($path, $savename = true, $replace = true)    {// 儲存 路徑 報錯名字        // 檔案上傳失敗,捕獲錯誤碼        if (!empty($this->info[‘error‘])) {// 捕獲 錯誤資訊代碼            $this->error($this->info[‘error‘]);            return false;        }        // 檢測合法性        if (!$this->isValid()) {// 合法性            $this->error = ‘非法上傳檔案‘;            return false;        }        // 驗證上傳        if (!$this->check()) {// 驗證上傳            return false;        }        $path = rtrim($path, DS) . DS;// 刪除 右側 分隔字元        // 檔案儲存命名規則        $saveName = $this->buildSaveName($savename);// 擷取 儲存的檔案名稱        $filename = $path . $saveName;// 組建檔案名稱        // 檢測目錄        if (false === $this->checkPath(dirname($filename))) {// 檢測 目錄            return false;        }        /* 不覆蓋同名檔案 */        if (!$replace && is_file($filename)) {// 同名檔案 覆蓋            $this->error = ‘存在同名檔案‘ . $filename;            return false;        }        /* 移動檔案 */        if ($this->isTest) {            rename($this->filename, $filename);// 移動檔案        } elseif (!move_uploaded_file($this->filename, $filename)) {// 普通上傳檔案            $this->error = ‘檔案上傳儲存錯誤!‘;            return false;        }        // 返回 File對象執行個體        $file = new self($filename);// 經過一系列的報錯 處理之後        $file->setSaveName($saveName);// 設定 報錯檔案        $file->setUploadInfo($this->info);// 儲存 資訊 到 資訊中        return $file;// 返回 執行個體化 控制代碼    }    /**     * 擷取儲存檔案名稱     * @param  string|bool   $savename    儲存的檔案名稱 預設自動產生     * @return string     */    protected function buildSaveName($savename)    {        if (true === $savename) {            // 自動組建檔案名            if ($this->rule instanceof \Closure) {                $savename = call_user_func_array($this->rule, [$this]);// 擷取 檔案名稱            } else {                switch ($this->rule) {                    case ‘md5‘:                        $md5      = md5_file($this->filename);                        $savename = substr($md5, 0, 2) . DS . substr($md5, 2);// md5 方式的檔案名稱                        break;                    case ‘sha1‘:                        $sha1     = sha1_file($this->filename);                        $savename = substr($sha1, 0, 2) . DS . substr($sha1, 2);// sha1 方式檔案名稱                        break;                    case ‘date‘:                        $savename = date(‘Ymd‘) . DS . md5(microtime(true));// 日期方式 檔案名稱                        break;                    default:                        $savename = call_user_func($this->rule);// 調用規則函數 組建檔案名                }            }        } elseif (‘‘ === $savename) {            $savename = $this->getInfo(‘name‘);// 空        }        if (!strpos($savename, ‘.‘)) {            $savename .= ‘.‘ . pathinfo($this->getInfo(‘name‘), PATHINFO_EXTENSION);// 有自己指定的檔案名稱        }        return $savename;    }    /**     * 擷取錯誤碼資訊     * @param int $errorNo  錯誤號碼     */    private function error($errorNo)// 錯誤資訊翻譯    {        switch ($errorNo) {            case 1:            case 2:                $this->error = ‘上傳檔案大小超過了最大值!‘;                break;            case 3:                $this->error = ‘檔案只有部分被上傳!‘;                break;            case 4:                $this->error = ‘沒有檔案被上傳!‘;                break;            case 6:                $this->error = ‘找不到臨時檔案夾!‘;                break;            case 7:                $this->error = ‘檔案寫入失敗!‘;                break;            default:                $this->error = ‘未知上傳錯誤!‘;        }    }    /**     * 擷取錯誤資訊     * @return mixed     */    public function getError()// 返回錯誤資訊    {        return $this->error;    }}


本文出自 “專註php 群號:414194301” 部落格,請務必保留此出處http://jingshanls.blog.51cto.com/3357095/1877990

[李景山php]每天TP5-20170105|thinkphp5-File.php-2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.