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

5年以前  |  阅读数:921 次  |  编程语言:PHP 

本文讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例