shurik2k5/yii2-upload-behavior

由 mohorev/yii2-upload-behavior 提供的改进版本,用于 Yii 2 的上传行为

v1.2 2020-12-09 19:30 UTC

This package is auto-updated.

Last update: 2024-09-10 03:52:21 UTC


README

Build Status Total Downloads Scrutinizer Code Quality Code Coverage

Yii 2 的上传行为

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

在此行为中增加了从 URL 和本地文件加载文件的能力,并为两个或多个属性附加行为。

这是对 https://github.com/mohorev/yii2-upload-behavior/ 的增强版本

安装

建议通过 composer 安装此扩展。

运行以下命令之一:

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

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

"shurik2k5/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' => \mohorev\file\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(); ?>

从 URL 上传文件

要加载 URL 中的文件

$model = new Document();
$model->setScenario('update'); //Use scenarion for validation and load file
$model->uploadFromUrl('file', 'https://i.ytimg.com/vi/yfJbKba5xYM/maxresdefault.jpg');
$model->save();

从文件上传

要加载本地文件

$model = new Document();
$model->setScenario('update'); //Use scenarion for validation and load file
$model->uploadFromFile('file', \Yii::getAlias('@webroot/images/02.jpg'));
$model->save();

获取应用程序中的路径

获取上传 URL

$model->getUploadUrl('file');

获取上传路径

$model->getUploadPath('file');

上传图像并创建缩略图

缩略图处理需要安装 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}',
                //if need create all thumbs profiles on image upload
                'createThumbsOnSave' => true,
                //if need create thumb for one profile only on request by getThumbUploadUrl() method
                'createThumbsOnRequest' => true,
                //if you want to remove original upload file after images thumbs was generated
                'deleteOriginalFile' => true,
                'thumbs' => [
                    'thumb' => ['width' => 400, 'quality' => 90],
                    'preview' => ['width' => 200, 'height' => 200],
                    'news_thumb' => ['width' => 200, 'height' => 200, 'bg_color' => '000'],
                ],
            ],
        ];
    }
}

删除上传图像和所有缩略图

//remove image and all thumbs from 'photo' attribute
$model->deleteImage('photo');

路径和 URL 生成配置的灵活性

对于 path 和/或 url 行为属性的更灵活配置是使用回调或数组来定义 pathurl 生成逻辑。

I. 通过回调

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        [
            'class' => \mohorev\file\UploadImageBehavior::class,
            'attribute' => 'image',
            'scenarios' => ['insert', 'update'],
            'placeholder' => '@app/modules/user/assets/images/userpic.jpg',
            'path' => function ($model) {
                /** @var \app\models\UserProfile $model */
                $basePath = '@webroot/upload/profiles/';
                $path = implode('/', array_slice(str_split(md5($model->id), 2), 0, 2));
                return $basePath . $path;
            },
            'url' => function ($model) {
                /** @var \app\models\UserProfile $model */
                $baseUrl = '@web/upload/profiles/';
                $path = implode('/', array_slice(str_split(md5($model->id), 2), 0, 2));
                return $baseUrl . $path;
            },
            'thumbs' => [
                'thumb' => ['width' => 400, 'quality' => 90],
                'preview' => ['width' => 200, 'height' => 200],
                'news_thumb' => ['width' => 200, 'height' => 200, 'bg_color' => '000'],
            ],
        ],
    ];
}

II. 通过数组配置,通过定义类及其静态方法来生成路径/URL

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        [
            'class' => \mohorev\file\UploadImageBehavior::class,
            'attribute' => 'image',
            'scenarios' => ['insert', 'update'],
            'placeholder' => '@app/modules/user/assets/images/userpic.jpg',
            'path' => [UserProfile::class, 'buildAvatarPath'],
            'url' => [UserProfile::class, 'buildAvatarUrl'],
            'thumbs' => [
                'thumb' => ['width' => 400, 'quality' => 90],
                'preview' => ['width' => 200, 'height' => 200],
                'news_thumb' => ['width' => 200, 'height' => 200, 'bg_color' => '000'],
            ],
        ],
    ];
}

/**
 * Define two static methos in your model for path and URL generation
 */ 
/**
 * @param \app\models\UserProfile|\yii\db\ActiveRecord $profile
 * @return string
 */
public static function buildAvatarPath(UserProfile $model)
{
    $basePath = '@webroot/upload/profiles/';
    $path = implode('/', array_slice(str_split(md5($model->id), 2), 0, 2));

    return $basePath . $path;
}

/**
 * @param \app\models\UserProfile|\yii\db\ActiveRecord $profile
 * @return string
 */
public static function buildAvatarUrl(UserProfile $model)
{
    $baseUrl = '@web/upload/profiles/';
    $path = implode('/', array_slice(str_split(md5($model->id), 2), 0, 2));

    return $baseUrl . $path;
}

示例视图文件

<?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
  • path - 保存文件的目录的基本路径或路径别名
  • url - 文件的基本 URL 或路径别名
  • generateNewName - 设置为 true 或匿名函数接受旧文件名并返回新名称,默认值为 true
  • unlinkOnSave - 如果为 true,则当前属性文件将被删除,默认值为 true
  • unlinkOnDelete - 如果为 true,则在模型删除后当前属性文件将被删除。
  • deleteEmptyDir - 如果为 true,则在模型删除后删除 目录,默认值为 true

UploadImageBehavior 额外选项

  • createThumbsOnSave - 如果为 true,则在图像上传时创建所有缩略图配置文件
  • createThumbsOnRequest - 如果为 true,则仅在通过 getThumbUploadUrl('attribute', 'profile_name') 方法请求配置文件时创建缩略图。如果为 true,建议将 createThumbsOnSave 设置为 false
  • deleteOriginalFile - 如果为 true,则在生成图像缩略图后将删除 原始上传图像,默认值为 false
    注意 不要与 createThumbsOnRequest 选项一起使用,因为缩略图是在请求时生成的(不是在上传图像后),并且在第一个配置文件缩略图生成后,原始文件将被删除!

注意!

urlpath选项中,建议使用不可变的占位符,换句话说,尽量避免使用可能会更改的相关属性。这是一种不推荐的做法。例如

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

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

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

作者