Запись имени файла в базе после его загрузки

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Запись имени файла в базе после его загрузки

Сообщение Александр Гавриленко »

Привет ребята!
Возвратился к своему старому проекту и решил улучшить админку.
При загрузке файла не пишется его имя в базу, а выводит такое сообщение:

Код: Выделить всё

finfo_file(C:\Users\User\AppData\Local\Temp\php5104.tmp): failed to open stream: No such file or directory
Якобы не существует такого файла, либо директории.
Сам файл при этом загружается в нужную папку.
Модель:

Код: Выделить всё

public function upload()
    {
      if ($this->validate()) {
        $img = $this->imageFile;
        $this->images = $img->baseName.'.'.$img->extension;
        $img->saveAs(Yii::getAlias('@images').'/gallery/reward/'.$img->baseName.'.'.$img->extension);
        return true;
      } else {
        return false;
      }
    }
Контроллер:

Код: Выделить всё

public function actionIndex()
    {
        $searchModel = new RewardSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        $model = new Reward();

      //для нескольких файлов UploadedFile::getInstances
      if ($model->load(Yii::$app->request->post())) {
        $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
          if($model->upload() && $model->save()){
            Yii::$app->session->setFlash('success', 'Файлы загружены успешно!');
            return $this->refresh();
          }else {
            Yii::$app->session->setFlash('error', 'Внимание! Файлы не загружены!!!');
          }
      }

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
          'model' => $model,
        ]);
    }
А, что самое интересное, если файл не валидировать, то все как надо и загружается, и записывается в базу.
Подскажите пожалуйста, что нужно сделать?
Спасибо.
Аватара пользователя
Vi_ru_S
Сообщения: 61
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: Запись имени файла в базе после его загрузки

Сообщение Vi_ru_S »

Я только изучаю Yii но попробуйте посмотреть данное видео https://www.youtube.com/watch?v=2NOHrukCHBU Я сам шаг за шагом проверял код из данного видео и все работает как часы.
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери
Аватара пользователя
carono
Сообщения: 52
Зарегистрирован: 2018.04.28, 11:05

Re: Запись имени файла в базе после его загрузки

Сообщение carono »

Попробуй поменять местами if($model->upload() && $model->save()) иначе у тебя идет аплоад, где временный файл удаляется, а потом идет сохранение, где идет валидация уже не существующего файла
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Запись имени файла в базе после его загрузки

Сообщение proctoleha »

if($model->upload() && $model->save())
В этой строке вы сначала провалидировали и загрузили файл - $model->upload(), потом пытаетесь сохранить $model->save(). При вызове save() Yii2 также пытается провалидировать то, чего уже нет - файл то уже загружен.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Запись имени файла в базе после его загрузки

Сообщение Александр Гавриленко »

При таком раскладе if($model->save() && $model->upload()) файл загружается, в базе создается поле, но с пустым названием.
Пока проблема не решена.
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: Запись имени файла в базе после его загрузки

Сообщение dmg »

Код: Выделить всё

public function upload()
    {
      if ($this->validate()) {
        $img = $this->imageFile;
        $this->images = $img->baseName.'.'.$img->extension;
        $img->saveAs(Yii::getAlias('@images').'/gallery/reward/'.$img->baseName.'.'.$img->extension);
        $this->save(false);
        return true;
      } else {
        return false;
      }
    }
Ответить