xisio / yii2-upload-behavior
mohorev/yii2-upload-behavior 提供的 Yii 2 改进版上传行为
v1.1
2020-01-31 18:16 UTC
Requires
- php: >=5.6.0
- yiisoft/yii2: ~2.0.0
- yiisoft/yii2-httpclient: ~2.0.0
- yiisoft/yii2-imagine: ~2.2.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
This package is not auto-updated.
Last update: 2024-09-27 06:50:21 UTC
README
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'], ], ], ]; } }
路径和 URL 生成配置的灵活性
对于 path 和/或 url 行为属性的更灵活配置是使用回调或数组来定义 path 或 url 生成逻辑。
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选项一起使用,因为缩略图是在请求时生成(不是在上传图片后),并且第一次生成缩略图后原始文件将被删除!
注意!
建议在url和path选项中使用不可变占位符,换句话说,尽量不使用可能会改变的属性。这是一种不好的做法。例如
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会改变,您也必须更改文件夹的名称,否则行为将不会正确工作。
作者
- 亚历山大·莫霍列夫 dev.mohorev@gmail.com
- 阿列克谢·萨莫约洛夫 alexey.samoylov@gmail.com
- 亚历山大·波戈列洛夫 shurik2k5@gmail.com