liyunfang/yii2-upload-behavior

Yii 2 的上传行为

安装次数: 1,657

依赖项: 0

建议者: 0

安全性: 0

星标: 16

关注者: 4

分支: 9

类型:yii2-extension

1.0.1 2015-10-20 09:46 UTC

This package is auto-updated.

Last update: 2024-09-24 12:12:05 UTC


README

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

此行为自动上传文件并将上传文件的名称作为值填充到指定的属性中。

Effect picture 1

安装

通过 composer 安装此扩展是首选方式。

运行以下命令之一

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

或者将此代码行添加到您的 composer.json 文件的 require 部分

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

使用方法

上传文件

在您的模型中附加行为

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,
                        //'generateNewName' => true,//function($file){return uniqid().$file->name.;}
                        //'unlinkOnSave' => true,
                        //'deleteTempFile' => true,
                        //'scenarios' => ['insert', 'update'],
                    ],
                    [
                        ....
                    ]
                ],
                //'multipleSeparator' => '|',
                //'nullValue' => '',
                //'instanceByName' => false,
                //'generateNewName' => true,//function($file){return uniqid().$file->name.;}
                //'unlinkOnSave' => true,
                //'deleteTempFile' => true,
                'scenarios' => ['insert', 'update'],
            ],
        ];
    }
}

示例:显示单个文件视图

<?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(); ?>

示例:显示多个文件视图

<?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,//function($file){return uniqid().$file->name.;}
                        //'unlinkOnSave' => true,
                        //'deleteTempFile' => true,
                        //'scenarios' => ['insert', 'update'],
                        //'createThumbsOnSave' => true,
                        //'createThumbsOnRequest' => true,
                        // '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,//function($file){return uniqid().$file->name.;}
                //'unlinkOnSave' => true,
                //'deleteTempFile' => true,
                //'createThumbsOnSave' => true,
                //'createThumbsOnRequest' => false,
                // 'thumbs' => [
                //    'thumb' => ['width' => 400, 'height' => 400,'quality' => 90],
                //    'preview' => ['width' => 200, 'height' => 200],
                //],
            ],
        ];
    }
}

示例:显示单个文件视图

<?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(); ?>

示例:显示多个文件视图

<?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', 'profile' => 'preview']),
          'overwriteInitial'=> !$model->image ? false: true,

行为选项

  • attributes - 保存附件集合的属性
  • scenarios - 行为将被触发的情况
  • instanceByName - 通过名称获取文件实例,如果您在 RESTfull 应用程序中使用 UploadBehavior 而且不需要模型名称的前缀,则将属性 instanceByName = false 设置为,默认值是 false
  • path - 保存文件的目录的基础路径或路径别名。
  • url - 此文件的基础 URL 或路径别名。
  • generateNewName - 设置为 true 或匿名函数接受旧文件名并返回新名称,默认值是 true
  • unlinkOnSave - 如果 true,则当前属性文件将被删除,默认值是 true
  • unlinkOnDelete - 如果 true,则模型删除后当前属性文件将被删除。

注意!

建议在 urlpath 选项中使用不可变的占位符,换句话说,尽量不要使用可以更改的关联属性。这是一种不好的做法。例如

class Track extends ActiveRecord
{
    public function getArtist()
    {
        return $this->hasOne(Artist::className(), [ 'id' => 'id_artist' ]);
    }

    public function behaviors()
    {
        return [
            [
                'class' => UploadBehavior::className(),
                'attribute' => 'image',
                'scenarios' => ['default'],
                'path' => '@webroot/uploads/{artist.slug}',
                'url' => '@web/uploads/{artist.slug}',
            ],
        ];
    }
}

如果相关模型属性 slug 将会改变,您也必须更改文件夹的名称,否则行为将无法正确工作。