Бортовой журнал Ктулху

Загрузка файла в Yii2

Yii2 обладает собственным классом загрузки файлов \Yii\we\UploadedFile, который представляет файл в виде объекта для удобства дальнейшей работы. 

 

Форма

use app\models\Attachments;
$attachment = new Attachments();
 
$attach_form = ActiveForm::begin(
[
'options' => ['enctype' => 'multipart/form-data'],
'id' => 'upload-attachment',
'action' => Yii::$app->homeUrl."mail/ajax"
]
);
echo $attach_form->field($attachment, 'kind')->hiddenInput(['value' => 'attachupload']);
echo $attach_form->field($attachment, 'file')->fileInput();
?>
<label class="btn btn-primary">
<i class="glyphicon glyphicon-upload"></i> Загрузить файл
<?= Html::submitButton('<i class="glyphicon glyphicon-floppy-disk"></i> Сохранить', ['class' => 'btn btn-default', 'style' => 'display:none']) ?>
</label>
<?php ActiveForm::end(); ?>

Здесь используется модель Attachents, о которой ниже.

Модель

В методе Rules() указываются правила валидации. В данном случае указывается расшрение файла. Тут можно посмотреть как валидация работает и примеры правил.

use yii\web\UploadedFile;
public $file;
public function rules()
 {
 return [
 [['file'], 'file', 'extensions' => 'png, jpg'],
 ];
 }
public function upload()
{
$filename = $this->file->baseName . $this->event . '_' . rand(1, 9) . $this->file->extension;
if(trim($filename) !== '.') {
if ($this->validate()) {
$this->file->saveAs('path_to_save_attachments/' . $filename);
return ['status' => 1, 'file' => $filename];
}
} else return ['status' => 0];
}

Контроллер

use app\models\Attachments;
use yii\web\UploadedFile;
$model = new Attachments();
$model->file = UploadedFile::getInstance($model, 'file');
$upload_res = $model->upload();