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 xml-rpc远程调用
Dec 19 PHP
PHP 获取目录下的图片并随机显示的代码
Dec 28 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
php根据生日计算年龄的方法
Jul 13 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
thinkphp实现分页显示功能
Dec 03 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
Mar 15 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PDO::quote讲解
Jan 29 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
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP中overload与override的区别
2017/02/13 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
JS取文本框中最小值的简单实例
2013/11/29 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用python实现生成用户信息
2017/03/20 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
团代会邀请函
2015/02/02 职场文书
国际贸易实训总结
2015/08/03 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书