myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Как загружать и обновлять изображения в Yii?

Здравствуйте! Подскажите пожалуйста как можно сохранять изображения в Yii2? Объявил дополнительную переменную $file и добавил код загрузки в модель после сохранения. Данные в отладчике есть, но в корень и базу не загружаются...

Код загрузки
public function beforeSave($insert)
    {
        if ($file = UploadedFile::getInstance($this, 'file')){
            $dir = Yii::getAlias('@images').'/trener/';
            if (file_exists($dir.$this->img)){
                unlink($dir.$this->img);
            }
            if (file_exists($dir.'50x50/'.$this->img)){
                unlink($dir.'50x50/'.$this->img);
            }
            if (file_exists($dir.'/800x/'.$this->img)){
                unlink($dir.'800x/'.$this->img);
            }
            $this->img = strtotime('now').Yii::$app->getSecurity()->generateRandomString(6) . '.' .$file->extension;
            $file->saveAs($dir.$this->img);

        }
        return parent::beforeSave($insert); // TODO: Change the autogenerated stub
    }


Поле формы
<?= $form->field($model, 'img')->widget(FileInput::classname(), [
        'pluginOptions' => [
            'showCaption' => false,
            'showRemove' => false,
            'showUpload' => false,
            'browseClass' => 'btn btn-primary btn-block',
            'browseIcon' => '<i class="glyphicon glyphicon-camera"></i> ',
            'browseLabel' =>  'Выбрать изображение'
        ],
        'options' => ['accept' => 'image/*']
    ]) ?>


Хотелось бы ещё узнать код для подгрузки в форму при update
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Вы добавили переменную file, а в форме используете img, но при этом пытаетесь сохранить картинку из file, в которой явно null, замените:
$form->field($model, 'img')
на
$form->field($model, 'file')
Ну и вот тут глупость:
$file->saveAs($dir.$this->img);
У Вас в $this->img нет названия файла, там null. Так что если хотите сохранить с именем, которое было у файла, то видимо так:
$name = $file->baseName . '.' . $file->extension; //формируем имя и расширение
if($file->saveAs($dir.$name)){ //проверяем сохранилось ли
  $this->img = $name; //если сохранилось записываем имя в атрибут, который сохранит имя в базу
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Доброй ночи.
Вы немного не так используете beforeSave();
public function beforeSave($insert)
    {
      if(parent::beforeSave($insert)){
          if ($file = UploadedFile::getInstance($this, 'file')){
              $dir = Yii::getAlias('@images').'/trener/';
              if (file_exists($dir.$this->img)){
                  unlink($dir.$this->img);
              }
              if (file_exists($dir.'50x50/'.$this->img)){
                unlink($dir.'50x50/'.$this->img);
              }
              if (file_exists($dir.'/800x/'.$this->img)){
                unlink($dir.'800x/'.$this->img);
              }
              $this->img = strtotime('now').Yii::$app->getSecurity()->generateRandomString(6) . '.' .$file->extension;
              $file->saveAs($dir.$this->img);
         }     
          return true;
      }
      return false
    }


P.S.
На буржуйском
На рідній мові )))))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы