yii2高级应用之自定义组件实现全局使用图片上传功能的方法


Posted in PHP onOctober 08, 2016

本文讲述了yii2高级应用之自定义组件实现全局使用图片上传功能的方法。分享给大家供大家参考,具体如下:

此例为yii2高组应用,这里只提供一个简单的事例

在yii2中,在使用到上传图片时有自带的一个上传图片类,但不太好用。

其中有一种方式,把自己写的一个上传图片类文件,注册成一个组件,在全局中使用。(我记得我在里面有写过一篇小物件的使用)

这里,我只作一个简单的自定义组件介绍

1、在backend(或frontend)定义一个 upload.php(注意路径: backend/components)

//图片上传处理类(这里略)
//upload.php事例代码
namespace backend\components;
class Upload
{
  public function test(){
    $a = '你好';
    return $a;
  }
}

2、backend/config/main.php 注册刚写的自定义组件

'components' => [
  'imgload' => [
    'class' => 'backend\components\Upload'
  ],
]

3、控制器中如何使用

public function actionArticlelist()
{
  $cc = Yii::$app->imgload->test();
  var_dump($cc);exit;
}

那么,一个完整的图片上传组件这里就不写了。

这里只写了一个使用自定义组件的方法!

还是补进进来吧。

1、自定义组件,便于全局使用。backend/config/main.php

'components' => [
  'user' => [
    'identityClass' => 'common\models\AgMerch',
    'enableAutoLogin' => true,
  ],
  //自定义图片上传类
  'imgload' => [
    'class' => 'agent\components\Upload'
  ],
]

2、自定义图片上传类 backend/components/Upload.php

namespace agent\components;
use yii;
use yii\base\Object;
use yii\web\UploadedFile;
class Upload extends Object
{
  /**
   * [UploadPhoto description]
   * @param [type] $model   [实例化模型]
   * @param [type] $path    [图片存储路径]
   * @param [type] $originName [图片源名称]
   * @param boolean $isthumb  [是否要缩略图]
   */
  public function UploadPhoto($model,$path,$originName,$isthumb=false){
    $root = $_SERVER['DOCUMENT_ROOT'].'/'.$path;
    //返回一个实例化对象
    $files = UploadedFile::getInstance($model,$originName);
    $folder = date('Ymd')."/";
    $pre = rand(999,9999).time();
    if($files && ($files->type == "image/jpeg" || $files->type == "image/pjpeg" || $files->type == "image/png" || $files->type == "image/x-png" || $files->type == "image/gif"))
    {
      $newName = $pre.'.'.$files->getExtension();
    }else{
      die($files->type);
    }
    if($files->size > 2000000){
      die("上传的文件太大");
    }
    if(!is_dir($root.$folder))
    {
      if(!mkdir($root.$folder, 0777, true)){
        die('创建目录失败...');
      }else{
      //  chmod($root.$folder,0777);
      }
    }
    //echo $root.$folder.$newName;exit;
    if($files->saveAs($root.$folder.$newName))
    {
      if($isthumb){
        $this->thumbphoto($files,$path.$folder.$newName,$path.$folder.'thumb'.$newName);
        return $path.$folder.$newName.'#'.$path.$folder.'thumb'.$newName;
      }else{
        return $path.$folder.$newName;
      }
    }
  }
}

3、控制器部分

use backend\components\Upload;
public function actionArtadd(){
  $model = new Article();
  if ($model->load(Yii::$app->request->post())) {
    //cover为表中的字段名
    $img = Yii::$app->imgload->UploadPhoto($model,'uploads/article/','cover');
    $model->cover = $img;//存入表中
    if($model->save()){
      Yii::$app->getSession()->setFlash('info', '添加成功!');
      return $this->redirect(['xxx']);
    }else{
      Yii::$app->getSession()->setFlash('info', '添加失败!');
      @unlink($img);
      return $this->redirect(['xxx']);
    }
  }
  //代码略
}

4、视图 (部分代码)

<?= $form->field($model, 'cover', [
  'options'=>['class'=>''],
  'inputOptions' => ['class' => 'form-control'],
])->fileInput()->label(false); ?>

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
如何使用脚本模仿登陆过程
Nov 22 PHP
PHP通用检测函数集合
Nov 25 PHP
基于php权限分配的实现代码
Apr 28 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
PHP定时任务获取微信access_token的方法
Oct 10 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
Oct 11 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 PHP
ThinkPHP发送邮件示例代码
Oct 08 #PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 #PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 #PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
Oct 08 #PHP
PHP反射API示例分享
Oct 08 #PHP
验证坐标在某坐标区域内php代码
Oct 08 #PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 #PHP
You might like
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
python正则表达式re模块详解
2014/06/25 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python实现名片管理系统
2018/11/29 Python
Python实现多属性排序的方法
2018/12/05 Python
python SVM 线性分类模型的实现
2019/07/19 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
Android interview questions
2016/12/25 面试题
如何转换一个字符串到enum值
2014/04/12 面试题
大学军训自我鉴定
2013/12/15 职场文书
义和团口号
2014/06/17 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers