全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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);

总结

以上所述是小编给大家介绍的PHP Laravel 上传图片、文件等类封装,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# laravel  # 上传图片  # 文件类封装  # Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解  # vuejs+element-ui+laravel5.4上传文件的示例代码  # 修改Laravel5.3中的路由文件与路径  # 在Laravel5中正确设置文件权限的方法  # PHP框架laravel的.env文件配置教程  # Laravel最佳分割路由文件(routes.php)的方式  # PHP Laravel实现文件下载功能  # Laravel框架文件上传功能实现方法示例  # Laravel基础-关于引入公共文件的两种方式  # 使用laravel指定日志文件记录任意日志  # Laravel5.1 框架文件管理操作实例分析  # 上传  # 错误信息  # 小编  # 上传文件  # 是否合法  # 多个  # 在此  # 还不  # 给大家  # 不存在  # 如果不是  # 不做  # 装了  # 所述  # 给我留言  # 转成  # 感谢大家  # 文件上传  # 疑问请 


相关文章: 5种Android数据存储方式汇总  利用JavaScript实现拖拽改变元素大小  历史网站制作软件,华为如何找回被删除的网站?  海南网站制作公司有哪些,海口网是哪家的?  如何快速启动建站代理加盟业务?  香港服务器选型指南:免备案配置与高效建站方案解析  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  建站之星展会模版如何一键下载生成?  如何通过商城免费建站系统源码自定义网站主题?  如何在IIS中新建站点并配置端口与物理路径?  建站之星会员如何解锁更多建站功能?  定制建站是什么?如何实现个性化需求?  如何通过.red域名打造高辨识度品牌网站?  招商网站制作流程,网站招商广告语?  ,想在网上投简历,哪几个网站比较好?  实例解析angularjs的filter过滤器  详解jQuery中基本的动画方法  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何使用Golang table-driven基准测试_多组数据测量函数效率  Thinkphp 中 distinct 的用法解析  网站代码制作软件有哪些,如何生成自己网站的代码?  浅谈Javascript中的Label语句  Java解压缩zip - 解压缩多个文件或文件夹实例  如何快速生成专业多端适配建站电话?  如何通过商城自助建站源码实现零基础高效建站?  如何用VPS主机快速搭建个人网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何用y主机助手快速搭建网站?  建站之星如何助力企业快速打造五合一网站?  山东网站制作公司有哪些,山东大源集团官网?  建站主机无法访问?如何排查域名与服务器问题  如何在阿里云虚拟服务器快速搭建网站?  如何确保西部建站助手FTP传输的安全性?  已有域名能否直接搭建网站?  建站之星如何实现五合一智能建站与营销推广?  如何高效生成建站之星成品网站源码?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  移民网站制作流程,怎么看加拿大移民官网?  大连 网站制作,大连天途有线官网?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  自助网站制作软件,个人如何自助建网站?  存储型VPS适合搭建中小型网站吗?  建站主机功能解析:服务器选择与快速搭建指南  建站之星伪静态规则如何设置?  如何选择高性价比服务器搭建个人网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  定制建站策划方案_专业建站与网站建设方案一站式指南  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。