最初的梦想 2015-10-20 16:11:00 16899次浏览 12条评论 24 4 0

Upload behavior for Yii 2

项目地址:https://github.com/liyunfang/yii2-upload-behavior

注意: 参考项目 https://github.com/mongosoft/yii2-upload-behavior

这个扩展会自动上传文件并填充指定的属性值和上传文件的名称。

UploadBehavior1.png

安装

安装该扩展的首选方式 composer.

编辑运行

composer require --prefer-dist liyunfang/yii2-upload-behavior "*"

或者在composer.json文件中的require部分添加如下代码:

"liyunfang/yii2-upload-behavior": "*"

如何使用

上传文件

在你任意的一个有上传文件的model类中:

class Document extends ActiveRecord
{
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['attachment', 'file','maxFiles' => 2, 'extensions' => 'doc, docx, pdf', 'on' => ['insert', 'update']],
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getCategory()
    {
        return $this->hasOne(Category::className(), [ 'id' => 'id_category' ]);
    }

    /**
     * @inheritdoc
     */
    function behaviors()
    {
        return [
            [
                'class' => UploadBehavior::className(),
                'attributes' => [
                    [
                        'attribute' => 'attachment',//属性名
                        'path' => '@webroot/upload/docs/{category.id}', //保存物理路径
                        'url' => '@web/upload/docs/{category.id}',      //访问地址路径
                        //'multiple' => true, //是否多文件上传
                        //'multipleSeparator' => '|', //文件名分隔符,会将文件保存到同一个字段中  未设置默认 |
                        //'nullValue' => '',
                        //'instanceByName' => false, //是否通过自定义name获取上传文件实例  未设置默认 false
                        //'generateNewName' => true, //是否自动生成文件名                  未设置默认 true
                        //'unlinkOnSave' => true,    //保存成功时是否删除原来的文件        未设置默认 true
                        //'deleteTempFile' => true,  //是否上传时删除临时文件              未设置默认 true
                        //'scenarios' => ['insert', 'update'], //在该情景下启用配置        
                    ],
                    [
                        ....
                    ]
                ],
                //'multipleSeparator' => '|', //如果属性中没有该配置则默认读取此配置
                //'nullValue' => '',          //如果属性中没有该配置则默认读取此配置
                //'instanceByName' => false,  //如果属性中没有该配置则默认读取此配置
                //'generateNewName' => true,  //如果属性中没有该配置则默认读取此配置
                //'unlinkOnSave' => true,     //如果属性中没有该配置则默认读取此配置
                //'deleteTempFile' => true,   //如果属性中没有该配置则默认读取此配置
                'scenarios' => ['insert', 'update'], //如果属性中没有该配置则默认读取此配置
            ],
        ];
    }
}

上传单个文件的view例子:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
    <?= $form->field($model, 'attachment')->fileInput() ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end(); ?>

上传多个文件的view例子:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
    <?= $form->field($model, 'attachment')->fileInput([
        'name' => Html::getInputName($model, 'attachment').'[]',
        'multiple' => true,
    ]) ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end(); ?>

上传图片并且创建缩略图

在你任意上传图片的实体类中:

class User extends ActiveRecord
{
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['image', 'image', 'extensions' => 'jpg, jpeg, gif, png', 'on' => ['insert', 'update']],
        ];
    }

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => \liyunfang\file\UploadImageBehavior::className(),
                'attributes' => [
                    [
                        'attribute' => 'image',
                        'path' => '@webroot/upload/user/{id}',
                        'url' => '@web/upload/user/{id}',
                        //'multiple' => true,
                        //'multipleSeparator' => '|',
                        //'nullValue' => '',
                        //'instanceByName' => false,
                        //'generateNewName' => true,
                        //'unlinkOnSave' => true,
                        //'deleteTempFile' => true,
                        //'scenarios' => ['insert', 'update'],
                        //'createThumbsOnSave' => true,    //是否在保存时创建缩略图 默认true
                        //'createThumbsOnRequest' => true, //是否在请求图片时创建缩略图 默认false
                        // 'thumbs' => [
                        //    'thumb' => ['width' => 400, 'height' => 400,'quality' => 90],
                        //    'preview' => ['width' => 200, 'height' => 200],
                        //    ...       
                        //],
                        //'placeholder' => '@app/modules/user/assets/images/userpic.jpg', //默认图片
                        //'thumbPath' => '@webroot/upload/user/{id}/thumb',  //缩略图保存物理路径
                        //'thumbUrl' => '@web/upload/user/{id}/thumb',   //缩略图访问地址
                    ],
                    [
                        ....
                    ]
                ],
                'scenarios' => ['insert', 'update'],
                //'multipleSeparator' => '|',
                //'nullValue' => '',
                //'instanceByName' => false,
                //'generateNewName' => true,
                //'unlinkOnSave' => true,
                //'deleteTempFile' => true,
                //'createThumbsOnSave' => true,       //如果属性中没有该配置则默认读取此配置
                //'createThumbsOnRequest' => false,  //如果属性中没有该配置则默认读取此配置
                // 'thumbs' => [
                //    'thumb' => ['width' => 400, 'height' => 400,'quality' => 90],
                //    'preview' => ['width' => 200, 'height' => 200],
                //],    //如果属性中没有该配置则默认读取此配置
            ],
        ];
    }
}

显示单个图片的view例子:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
    <div class="form-group">
        <div class="row">
            <div class="col-lg-6">
                <!-- Original image -->
                <?= Html::img($model->getUploadUrl('image'), ['class' => 'img-thumbnail']) ?>
            </div>
            <div class="col-lg-4">
                <!-- Thumb 1 (thumb profile) -->
                <?= Html::img($model->getThumbUploadUrl('image'), ['class' => 'img-thumbnail']) ?>
            </div>
            <div class="col-lg-2">
                <!-- Thumb 2 (preview profile) -->
                <?= Html::img($model->getThumbUploadUrl('image', 'preview'), ['class' => 'img-thumbnail']) ?>
            </div>
        </div>
    </div>
    <?= $form->field($model, 'image')->fileInput(['accept' => 'image/*']) ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end(); ?>

显示多个图片的view例子:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
      <?php
            $imageUrls = $model->getUploadUrl(image);
            $imageUrls = $model->getThumbUploadUrl('image');
            $imageUrls = $model->getThumbUploadUrl('image', 'preview');
            foreach ($imageUrls as $imgUrl) {
                ...
            }
      
      ?>
<?php ActiveForm::end(); ?>

如果你安装了此扩展 https://github.com/kartik-v/yii2-widget-fileinput
配置如下

      $form->field($model, 'image')->widget(FileInput::classname(), [
          'options' => [
                'accept' => 'image/*',
                'multiple' => true,
                'name' => Html::getInputName($model, 'image').'[]',
      ],
      'pluginOptions' => [
          'initialPreview'=> !$model->image ? [] : $model->createPreview(['attribute' => 'image']),
          'overwriteInitial'=> !$model->image ? false: true,

注意点

  • attributes - 需要上传文件的属性配置
  • scenarios - 启用情景
  • instanceByName - 从自定义name获取上传文件
  • path - 保存物理路径
  • url - 访问文件url
  • generateNewName - 自动生成文件名
  • unlinkOnSave - 如果设置为true在保存成功后将会删除原来的文件
  • unlinkOnDelete - 如果设置为true 在删除数据后将删除文件
觉得很赞
  • 评论于 2015-11-09 14:35 举报

    大哥,你那个behaviors下的"..."里是什么东东,解释一下

    1 条回复
    评论于 2015-11-10 09:32 回复

    看下边的回复

  • 评论于 2015-11-10 09:32 举报

    @drykiss
    attributes 需要上传文件的字段
    multiple 是否多文件
    multipleSeparator 文件名分隔符(会存到一个字段中)
    instanceByName 是否通过自定义name获取上传文件
    generateNewName 自动生成新文件名
    unlinkOnSave 保存时是否删除旧文件
    deleteTempFile 删除临时文件
    scenarios 启用的情景
    thumbs 缩略图,可以自定义 thumb和preview 只是参考

    这些配置在每个字段中可配置,如果没有配置则读取最外边的配置

    1 条回复
    评论于 2015-11-10 09:54 回复

    这些是views里的?还是model里的?

  • 评论于 2015-11-10 09:53 举报

    yii2-widget-fileinput有什么作用,又和yii2-upload-behavior有什么关系,有互助的作用吗?

  • 评论于 2015-11-10 10:00 举报

    我还想问一下,controller里不写东西吗?

    3 条回复
    评论于 2015-11-10 11:42 回复

    把这个加到model的behavior里的时候配置的。
    yii2-widget-fileinput这个是界面
    yii2-upload-behavior这个是后台
    controller里不用写东西 只要model->save()就可以了

    评论于 2015-11-10 11:56 回复

    为什么值传不进来啊,好郁闷

    评论于 2015-11-11 09:39 回复

    现在有个问题 你得把这个属性 在rules里设置为 非必填字段 这个我会修改的

  • 评论于 2016-04-26 18:28 举报

    composer 不能安装,可以源码安装吗?怎么做

    2 条回复
    评论于 2016-05-19 17:56 回复

    你弄好了吗

    评论于 2016-05-31 17:45 回复

    后面没再弄

  • 评论于 2016-09-07 17:00 举报

    请问两个问题:
    1、attributes 需要上传文件的字段,文件上传后,该字段只存放“文件名”,上传的路径并没有写入数据库;
    2、如果要下载文件,view怎么写?就是怎么获取下载地址

    1 条回复
    评论于 2016-12-22 10:56 回复

    1、我看他这个上传路径是配置到behaviors的,读取的时候从behaviors中配置读取的。
    2、我也想知道怎么在view中写

  • 评论于 2016-09-07 18:38 举报

    大哥,按钮的背景样式咋写的啊

  • 评论于 2016-12-22 09:54 举报

    嗯可以正常使用了。也想问下view中怎么显示图片呢??

  • 评论于 2017-03-20 17:07 举报

    你好,插入数据库的代码在哪里写!

  • 评论于 2017-08-11 15:50 举报

    liyunfang\file\UploadBehavior这个安装完,要怎么引用UploadBehavior这个文件呢?引用路径我怎么写都是报错的?刚学的菜鸟,想问要怎么正确引用呢呢?
    49.png

    1 条回复
    评论于 2017-08-14 09:37 回复

    已解决...

  • 评论于 2018-09-07 10:56 举报

    path未设置咋整的呢1.png

  • 评论于 2018-09-07 10:57 举报

    1.png

您需要登录后才可以评论。登录 | 立即注册