PHP 中實現Laravel 上傳圖片、檔案等類封裝詳解

來源:互聯網
上載者:User
這篇文章主要介紹了PHP Laravel 上傳圖片、檔案等類封裝的實現代碼,需要的朋友可以參考下

具體代碼如下:

<?php /**  * Created by PhpStorm.  * User: wady www.bcty365.com  * Date: 2017/8/16  * Time: 14:52  */ namespace App\ThinkClass; use Symfony\Component\HttpFoundation\File\UploadedFile; class UploadClass {   /**    * @var UploadedFile $file;    */   protected $file;   /**    * 上傳錯誤資訊    * @var string    */   private $error = ''; //上傳錯誤資訊   private $fullPath='';//絕對位址   private $config = array(     'maxSize'    => 3*1024*1024, //上傳的檔案大小限制 (0-不做限制)     'exts'     => array('jpg','jpeg','gif','png','doc','docx','xls','xlsx','ppt','pptx','pdf','rar','zip'), //允許上傳的檔案尾碼     'subName'    => '', //子目錄建立方式,[0]-函數名,[1]-參數,多個參數使用數組     'rootPath'   => '/uploads/', //儲存根路徑     'savePath'   => '', //儲存路徑     'thumb'     => array(),//是裁剪壓縮比例   );   public function __construct($config = array()){     /* 擷取配置 */     $this->config  =  array_merge($this->config, $config);     if(!emptyempty($this->config['exts'])){       if (is_string($this->exts)){         $this->config['exts'] = explode(',', $this->exts);       }       $this->config['exts'] = array_map('strtolower', $this->exts);     }     $this->config['subName'] = $this->subName ? ltrim($this->subName,'/') : '/'.date('Ymd');     $this->fullPath = rtrim(public_path(),'/').$this->config['rootPath'];   }   public function __get($name) {     return $this->config[$name];   }   public function __set($name,$value){     if(isset($this->config[$name])) {       $this->config[$name] = $value;     }   }   public function __isset($name){     return isset($this->config[$name]);   }   /**    * 擷取最後一次上傳錯誤資訊    * @return string 錯誤資訊    */   public function getError(){     return $this->error;   }   public function upload($file){      if(emptyempty($file)){        $this->error = '沒有上傳的檔案';        return false;      }      if(!$this->checkRootPath($this->fullPath)){        $this->error = $this->getError();        return false;      }      $fileSavePath=$this->fullPath.$this->savePath.$this->subName;      if(!$this->checkSavePath($fileSavePath)){        $this->error = $this->getError();        return false;      }      $files =array();      if(!is_array($file)){        //如果不是數組轉成數組        $files[]=$file;      }else{        $files=$file;      }     $info  = array();      $imgThumb = new \App\ThinkClass\ThumbClass();      foreach ($files as $key=>$f){        $this->file=$f;         $f->ext = strtolower($f->getClientOriginalExtension());        /*檔案上傳檢查*/        if (!$this->check($f)){          continue;        }        $fileName = str_random(12).'.'.$f->ext;        /* 儲存檔案 並記錄儲存成功的檔案 */        if ($this->file->move($fileSavePath,$fileName)) {          /*圖片按照寬高比例壓縮*/          \Log::notice($fileSavePath.$fileName);          if(!emptyempty($this->thumb) && is_array($this->thumb)){            $imgThumb ->thumb($this->thumb,$fileSavePath.'/'.$fileName);          }          $info[]=$this->rootPath.$this->savePath.$this->subName.'/'.$fileName;        }      }      return is_array($info) ? $info : false;   }   /**    * 檢測上傳根目錄    * @param string $rootpath  根目錄    * @return boolean true-檢測通過,false-檢測失敗    */   protected function checkRootPath($rootpath){     if(!(is_dir($rootpath) && is_writable($rootpath))){       $this->error = '上傳根目錄不存在!';       return false;     }     return true;   }   /**    * 檢測上傳目錄    * @param string $savepath 上傳目錄    * @return boolean     檢測結果,true-通過,false-失敗    */   public function checkSavePath($savepath){     /* 檢測並建立目錄 */     if (!$this->mkdir($savepath )) {       return false;     } else {       /* 檢測目錄是否可寫 */       if (!is_writable($savepath)) {         $this->error = '上傳目錄不可寫!';         return false;       } else {         return true;       }     }   }   /**    * 檢查上傳的檔案    * @param array $file 檔案資訊    */   private function check($file) {     /* 檢查檔案大小 */     if (!$this->checkSize($file->getSize())) {       $this->error = '上傳檔案大小不符!';       return false;     }     /* 檢查檔案尾碼 */     if (!$this->checkExt($file->ext)) {       $this->error = '上傳檔案尾碼不允許';       return false;     }     /* 通過檢測 */     return true;   }   /**    * 檢查檔案大小是否合法    * @param integer $size 資料    */   private function checkSize($size) {     return !($size > $this->maxSize) || (0 == $this->maxSize);   }   /**    * 檢查上傳的檔案尾碼是否合法    * @param string $ext 尾碼    */   private function checkExt($ext) {     return emptyempty($this->config['exts']) ? true : in_array(strtolower($ext), $this->exts);   }   /**    * 建立目錄    * @param string $savepath 要建立的穆裡    * @return boolean     建立狀態,true-成功,false-失敗    */   protected function mkdir($savepath){     if(is_dir($savepath)){       return true;     }     if(mkdir($savepath, 0777, true)){       return true;     } else {       $this->error = "目錄建立失敗";       return false;     }   } }

使用案例:

頭部引用 use App\ThinkClass\UploadClass;

$upload = new UploadClass(); $upload->exts=array('jpg','png'); $upload->maxSize=5*1024*1024; $upload->savePath='course/uid_6'; $file = $request->file('fileImg'); $aa = $upload->upload($file); dd($aa);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.