mongosoft/yii2-upload-behavior

该包已被废弃,不再维护。作者建议使用 mohorev/yii2-upload-behavior 包。

Yii 2 的上传行为

安装数: 96,132

依赖者: 12

建议者: 0

安全: 0

星标: 130

关注者: 12

分支: 58

开放问题: 5

类型:yii2-extension

0.2.4 2023-10-28 17:52 UTC

This package is auto-updated.

Last update: 2023-10-28 17:54:55 UTC


README

此行为自动上传文件,并将指定属性填充为上传文件的名字。此代码受到 https://github.com/yii-dream-team/yii2-upload-behavior 的启发,但并非直接衍生。

Latest Version Software License Build Status Quality Score

安装

建议通过 composer 安装此扩展。

运行以下命令

php composer.phar require --prefer-dist mohorev/yii2-upload-behavior "*"

或者在您的 composer.json 文件的 require 部分添加以下代码行

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

使用方法

上传文件

在模型中附加行为

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

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

    /**
     * @inheritdoc
     */
    function behaviors()
    {
        return [
            [
                'class' => UploadBehavior::class,
                'attribute' => 'file',
                'scenarios' => ['insert', 'update'],
                'path' => '@webroot/upload/docs/{category.id}',
                'url' => '@web/upload/docs/{category.id}',
            ],
        ];
    }
}

在控制器操作中设置模型场景

class Controller extends Controller
{
    public function actionCreate($id)
    {
        $model = $this->findModel($id);
        $model->setScenario('insert'); // Note! Set upload behavior scenario.
        
        ...
        ...
    }
}

示例视图文件

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

上传图片并创建缩略图

缩略图处理需要安装 yiisoft/yii2-imagine

在模型中附加行为

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' => \mohorev\file\UploadImageBehavior::class,
                'attribute' => 'image',
                'scenarios' => ['insert', 'update'],
                'placeholder' => '@app/modules/user/assets/images/userpic.jpg',
                'path' => '@webroot/upload/user/{id}',
                'url' => '@web/upload/user/{id}',
                'thumbs' => [
                    'thumb' => ['width' => 400, 'quality' => 90],
                    'preview' => ['width' => 200, 'height' => 200],
                    'news_thumb' => ['width' => 200, 'height' => 200, 'bg_color' => '000'],
                ],
            ],
        ];
    }
}

示例视图文件

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

行为选项

  • attribute - 存储附件的属性
  • scenarios - 触发行为的情况
  • instanceByName - 通过名字获取文件实例,如果您在 RESTfull 应用中使用 UploadBehavior 而不需要模型名称的前缀,请将属性 instanceByName = false 设置为 false,默认值是 false
  • path - 保存文件的目录的基本路径或路径别名
  • url - 该文件的基本 URL 或路径别名
  • generateNewName - 设置为 true 或匿名函数接受旧文件名并返回新名称,默认值是 true
  • unlinkOnSave - 如果为 true,则当前属性文件将被删除,默认值是 true
  • unlinkOnDelete - 如果为 true,则在模型删除后当前属性文件将被删除。
  • deleteOriginalFile - 仅适用于 UploadImageBehavior。如果为 true,则在生成缩略图后原始图片文件将被删除,默认值是 false

注意!

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

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

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

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