h0rseduck / yii2-upload-behavior
为 Yii 2 设计的上传行为
0.3.5
2021-03-08 09:02 UTC
Requires
- php: >=5.6.0
- yiisoft/yii2: ~2.0.0
Requires (Dev)
- phpunit/dbunit: ~1.0
- phpunit/phpunit: ~4.0
- yiisoft/yii2-imagine: ^2.1
Suggests
- yiisoft/yii2-imagine: Required to use thumbnails processing with UploadImageBehavior
README
此行为会自动上传文件并将上传文件的名称填充到指定的属性中。此代码灵感来源于https://github.com/mohorev/yii2-upload-behavior,但并非源自该代码。
安装
建议通过 composer 安装此扩展。
运行以下命令
php composer.phar require --prefer-dist h0rseduck/yii2-upload-behavior "*"
或将以下代码行添加到您的 composer.json
文件的 require
部分
"h0rseduck/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' => \h0rseduck\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 - 此文件的基地址或路径别名
- generateNewName - 设置为 true 或匿名函数接受旧文件名并返回新名称,默认值是
true
- unlinkOnSave - 如果为
true
,则当前属性文件将被删除,默认值是true
- unlinkOnDelete - 如果为
true
,则在模型删除后,当前属性文件将被删除。 - deleteOriginalFile - 仅适用于 UploadImageBehavior。如果为
true
,则在生成缩略图后,原始图像文件将被删除,默认值是false
。
注意!
建议在 url
和 path
选项中使用不可变占位符,换句话说,尽量不要使用可以更改的相关属性。这是一种不好的做法。例如
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
会改变,您也必须更改文件夹的名称,否则行为将无法正确工作。