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

(0)

相关推荐

  • PHP框架Laravel插件Pagination实现自定义分页

    Laravel 的分页很方便,其实扩展起来也挺容易的,下面就来做个示例,扩展一下 paginate() 和 simplePaginate() 方法,来实现我们自定义分页样式,比如显示 "上一页" 和 "下一页" ,而不是 "<" 和 ">" ,当然扩展的方法掌握了你就可以肆无忌惮的扩展一个你想要的分页了,比如跳转到某一页,分页显示一共多少记录,当前显示的记录范围等等巴拉巴拉的... 5.1和5.2应该是同样的方法,

  • PHP的Laravel框架中使用消息队列queue及异步队列的方法

    queue配置 首先说明一下我之前的项目中如何使用queue的. 我们现在的项目都是用的symfony,老一点的项目用的symfony1.4,新一点的项目用的都是symfony2.symfony用起来整体感觉还是很爽的,尤其symfony2,整体上来讲使用了很多java里面框架的设计思想.但是他不支持queue.在symfony,我们使用queue也经历了几个过程.最开始使用张堰同学的httpsqs.这个简单使用,但是存在单点.毕竟我们的项目还是正式对外服务的,所以我们研究了Apache旗下的开

  • PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面

    AdminLTE 是一个基于Bootstrap 3.x的免费高级管理控制面板主题,完全响应式管理,适合从小型移动设备到大型台式机很多的屏幕分辨率. AdminLTE的特点: 充分响应 可分类的仪表盘 18插件和3自定义插件 重量轻和快速 与大多数主流浏览器兼容 完全支持Glyphicons,Fontawesome和图标 我们使用的工具 Laravel AdminLTE 2.3.2 Bower Composer 下载一个全新的 Laravel 如果不太清楚可以去官方网站查看文档link 在此我们直

  • PHP的Laravel框架结合MySQL与Redis数据库的使用部署

    相对于熟读官方文档,更重要的是要把框架环境搭起来. 零.环境介绍 操作系统:centOS 数据库: mysql 5.6 (阿里云RDS) PHP 5.4.4 (>=5.4即可) Laravel 5.0 一.安装LNMP 在安装Laravel之前,需要把Linux + Nginx + Mysql + Php的环境搭建好.具体的搭建步骤这里就不再详述了. P.S. Linux阿里云已经自带了,本文使用的是centOS 6.5 64位的ECS 关于Nginx和Apache的选择看自己喜好,本文使用的是

  • 详解PHP的Laravel框架中Eloquent对象关系映射使用

    零.什么是 Eloquent Eloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',对象关系映射.ORM 的出现是为了帮我们把对数据库的操作变得更加地方便. Eloquent 让一个 'Model类' 对应一张数据库表,并且在底层封装了很多 'function',可以让 Model 类非常方便地调用. 来看一段如下代码: <?php class Article extends \Eloquent { protected $fillabl

  • Laravel最佳分割路由文件(routes.php)的方式

    前言 Laravel 的路由功能很强大,默认都是定义在 routes.php 文件中,随着项目越来越大,我们需要的定义的路由越来越多,想象一下,如果几百上千个路由都定义在一个文件中,如何去维护?也许还有不同的人都在同一个文件定义路由,这就造成了冲突,因此我们需要分割 routes.php 文件. 下面介绍一种很优雅的方式. 在 app/Providers/RouteServiceProvider.php 的 map 方法中可以如下定义: public function map(Router $r

  • 深入解析PHP的Laravel框架中的event事件操作

    有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过.下面就事件.事件监听举一个很简单的例子你就会发现. ​ 这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听

  • 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 UploadClas

  • C#封装的常用文件操作类实例

    本文实例讲述了C#封装的常用文件操作类.分享给大家供大家参考.具体如下: 这个C#类封装了我们经常能用到的文件操作方法,包括读写文件.获取文件扩展名.复制文件.追加内容到文件.删除文件.移动文件.创建目录.递归删除文件及目录.列目录.列文件等,不可多得. using System; using System.Text; using System.Web; using System.IO; namespace DotNet.Utilities { public class FileOperate

  • C#使用iTextSharp封装的PDF文件操作类实例

    本文实例讲述了C#使用iTextSharp封装的PDF文件操作类.分享给大家供大家参考.具体分析如下: 这个C#代码主要讲iTextSharp中用于操作PDF文件的方法进行了再次封装,可以更加方便的访问PDF文档,可以动态生成PDF文件.添加内容.设置段落.设置字体等. using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; namespace DotNet.Utilities { /// <summary> ///

  • 微信企业号 根据错误码返回错误信息类封装

    微信企业号根据错误码返回错误信息类封装 微信开发中返回错误码每次需要查询错误返回码文档才知道具体的错误信息(查看返回的errormsg也可知道),因此封装一个 错误码返回的类来查看! 纯粹的体力劳动!!! <span style="font-size:14px;">package org.oms.wechat.utils; /** * 企业号根据错误码返回错误信息类 * @author sunlight * */ public class ErrorCodeText { p

  • php实现搜索类封装示例

    本文为大家分享了php实现搜索类封装示例,供大家参考,具体内容如下 <?php /** * SoClass.php * 索引与搜索类 */ class SoClass { private $_xindex; private $_xsearch; private $_project; public function __construct($project){ //载入引导文件 require_once 'lib/XS.php'; //初始化 $xs = new XS($project); $th

  • C#常用目录文件操作类实例

    本文实例讲述了C#常用目录文件操作类.分享给大家供大家参考.具体分析如下: 这个c#类封装了常用的目录操作,包括列出目录下的文件.检测目录是否存在.得到目录下的文件列表.检测目录是否为空.查找目录下的文件等等功能 using System; using System.Text; using System.IO; namespace DotNet.Utilities { /// <summary> /// 文件操作夹 /// </summary> public static clas

  • PHP常用的类封装小结【4个工具类】

    本文实例讲述了PHP常用的类封装.分享给大家供大家参考,具体如下: 这4个类分别是Mysql类. 分页类.缩略图类.上传类. Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ private function __construct(){} /** * 连接数据库 * @return obj 资源对象 */ private static function c

  • 解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题

    具体操作如下所示: 以前的图片可以访问 现在添加的图片都不可以访问 目录里面也有这张图片 1.来到public 看见这个目录没有 , 你删掉它 然后去到命令行 修改完了之后 你会发现 public 目录下面又会多了 storage 你在去 上传图片看看就没有问题了 1.你是不是移动过storage(比如使用git) 2.你是不是在storage下面创建过什么文件(只要是就对了) 以上这篇解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题就是小编分享给大家的全部内容了,希望能

  • python读取ini配置的类封装代码实例

    这篇文章主要介绍了python读取ini配置的类封装代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 此为基础封装,未考虑过多异常处理 类 # coding:utf-8 import configparser import os class IniCfg(): def __init__(self): self.conf = configparser.ConfigParser() self.cfgpath = '' def checkSec

  • Spring如何集成ibatis项目并实现dao层基类封装

    Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库的操作拥有更加灵活的控制,对于那些经常需要调用本地数据库函数自定义SQL语句,或是喜欢自己优化SQL执行效率的开发者来说,iBatis是一个非常不错的选择. 而得到广泛应用的开源企业架构SpringFramework,也很好的将其进行了集成,使得iBatis在 SpringFramework中的使用

随机推荐