PHP Laravel 上传图片、文件等类封装


Posted in PHP onAugust 16, 2017

今天把项目中上传功能封装成类,方便后面使用,简单的封装了一下,感觉还不怎么好,后面继续优化。

具体代码如下:

<?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 上传图片、文件等类封装,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
PHP多进程编程实例
Oct 15 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
php类常量用法实例分析
Jul 09 PHP
分享10段PHP常用代码
Nov 11 PHP
php 7新特性之类型申明详解
Jun 06 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 PHP
PHP数据库操作三:redis用法分析
Aug 16 #PHP
PHP数据库操作二:memcache用法分析
Aug 16 #PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 #PHP
PHP回调函数与匿名函数实例详解
Aug 16 #PHP
搭建自己的PHP MVC框架详解
Aug 16 #PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 #PHP
laravel 中如何使用ajax和vue总结
Aug 16 #PHP
You might like
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python 生成图形验证码的方法示例
2018/11/11 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
如何通过python检查文件是否被占用
2020/12/18 Python
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
农村结婚典礼司仪主持词
2014/03/14 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
ktv筹备计划书
2014/05/03 职场文书
鼓舞士气的口号
2014/06/16 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
在职证明格式样本
2015/06/15 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
python游戏开发之pygame实现接球小游戏
2022/04/22 Python