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 相关文章推荐
MVC模式的PHP实现
Oct 09 PHP
php,不用COM,生成excel文件
Oct 09 PHP
整理的9个实用的PHP库简介和下载
Nov 09 PHP
apache php模块整合操作指南
Nov 16 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 PHP
php的无刷新操作实现方法分析
Feb 28 PHP
Yii Framework框架开发微信公众平台示例
Apr 26 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 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 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
基于jquery的模态div层弹出效果
2010/08/21 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
python3安装speech语音模块的方法
2018/12/24 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
运动会表扬稿大全
2014/01/16 职场文书
绿色环保口号
2014/06/12 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2014年后备干部工作总结
2014/12/08 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript