Загрузка картини профиля.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Загрузка картини профиля.

Сообщение alexa777 »

У меня есть таблица для картинок Images и такая же модель Images.php
в таблице есть такие переменные
* @property int $id
* @property string $name
* @property string $refer
* @property int $refer_id
* @property int $user_id
И объявил переменную image

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

class Images extends \yii\db\ActiveRecord
{
    
    public $image;
Пытаюсь сделать загрузку картинок профиля через контролер ProfileController.php
в ProfileController.php поправил Экшен index чтобы форма загрузки работала(помимо формы там уже сделан вывод данных пользователя)

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

 public function actionIndex()
    {
        $image = new Images();
        
        return $this->render('index', [
            'model' => $this->findModel(),
            'image' => $image,
        ]);
    }


И второй Экшене для загрузки картинки

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

   public function actionUpload(){
        
       $image = new Images();
      
        if(Yii::$app->request->isPost){
            $image->image = UploadedFile::getInstance($image, 'image');      
            $image->upload();
            return;
       }else {
             return $this->render('index', [
                 'model' => $this->findModel(),
                 'image' => $image,
                 ]);
            
        }
во вьюшке profile/index сделал форму для загрузки

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

  <?php $form = ActiveForm::begin([
        'options' => ['enctype' => 'multipart/form-data'],
        'method' => 'post',
        'action' => ['profile/upload'],
        
        ]); ?>


    <?= $form->field($image, 'image')->fileInput() ?>
    <div class="form-group">
               <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?> 

Проблема в том что $_POST пустой, картинка не прикрепляется, вот что говорит Дамп
object(common\models\Images)#99 (11) { ["image"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> NULL ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_events":"yii\base\Component":private]=> array(0) { } ["_eventWildcards":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } }

В чем может быть причина?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Загрузка картини профиля.

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картини профиля.

Сообщение alexa777 »


Так у меня все тоже самое, и модель такая же. Я же написал, что сама картинка из формы

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

<?= $form->field($image, 'image')->fileInput() ?>
не доходит до actionUpload() там пусто Null ["image"]=> NULL
Если вы что то видите что я не так сделал, подскажите
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Загрузка картини профиля.

Сообщение urichalex »

Для формы установите enctype=multipart/form-data
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картини профиля.

Сообщение alexa777 »

urichalex писал(а): 2018.02.27, 20:15 Для формы установите enctype=multipart/form-data
так стоит же

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

 <?php $form = ActiveForm::begin([
        'options' => ['enctype' => 'multipart/form-data'],
        'method' => 'post',
        'action' => ['profile/upload'],
        
        ]); ?>
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Загрузка картини профиля.

Сообщение Dominus »

Может rules не прописан в Images для $image?
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картини профиля.

Сообщение alexa777 »

Dominus писал(а): 2018.02.27, 20:24 Может rules не прописан в Images для $image?
есть , сам весь день сижу голову ломаю, что ему надо

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

public function rules()
    {
        return [
            [['name', 'refer', 'refer_id', 'user_id'], 'required'],
            [['refer_id', 'user_id'], 'integer'],
            [['name'], 'string', 'max' => 150],
            [['refer'], 'string', 'max' => 50],
            [['image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, jpeg'],
        ];
    }
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Загрузка картини профиля.

Сообщение BalykhinAS »

в модели формы вы не упустили?

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

public function upload()
    {
        if ($this->validate()) { 
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
у вас прописаны правила для полей но вы их не выводите, быть может они не валидируются?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Загрузка картини профиля.

Сообщение Dominus »

А что выдаёт так?

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

public function actionUpload(){
        
       $image = new Images();
      
        if(Yii::$app->request->isPost){
        
            \yii\helpers\VarDumper::dump(Yii::$app->request->post(), 10, 1);
            
            $image->image = UploadedFile::getInstance($image, 'image');
            
            \yii\helpers\VarDumper::dump($image->image, 10, 1);
            die;

            $image->upload();
            return;
       }else {
             return $this->render('index', [
                 'model' => $this->findModel(),
                 'image' => $image,
                 ]);
            
        }
Должно что то типа:

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

[
    '_csrf' => '7qpZzjN9RO8CF1Fz_m1t8kL3s-7QZ36zLKuxJz4aUB_b_Q6hUQh1mDRhYDqkGSmzLL3QqKEfG8JG6eVGckBjZQ=='
    'Images' => [
        'imageFile' => ''
    ]
 yii\web\UploadedFile#1
(
    [name] => '31.01.2018_23-37-17.png'
    [tempName] => 'E:\\OpenServer\\userdata\\temp\\php4E8.tmp'
    [type] => 'image/png'
    [size] => 1235200
    [error] => 0
) 
Если так, то всё в порядке.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Загрузка картини профиля.

Сообщение BalykhinAS »

а собственно сама картинка в базу не записывается?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Загрузка картини профиля.

Сообщение Dominus »

Еще, файл передаётся не в $_POST а в $_FILES

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

public function actionUpload()
    {
        $model = new Images();
        if (Yii::$app->request->isPost) {
            \yii\helpers\VarDumper::dump($_POST, 10, 1);
            \yii\helpers\VarDumper::dump($_FILES, 10, 1);
            //$model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            //\yii\helpers\VarDumper::dump($model->imageFile, 10, 1);
            die;
            if ($model->upload()) {
                Yii::$app->session->setFlash('success', 'Файл успешно загружен.');
                return $this->refresh();
            }
            Yii::$app->session->setFlash('error', 'Не удалось загрузить файл!');
        }
        return $this->render('upload', [
            'model' => $model,
        ]);
    }

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

[
    '_csrf' => '7qpZzjN9RO8CF1Fz_m1t8kL3s-7QZ36zLKuxJz4aUB_b_Q6hUQh1mDRhYDqkGSmzLL3QqKEfG8JG6eVGckBjZQ=='
    'Images' => [
        'imageFile' => ''
    ]
] [
    'Images' => [
        'name' => [
            'imageFile' => '31.01.2018_23-37-17.png'
        ]
        'type' => [
            'imageFile' => 'image/png'
        ]
        'tmp_name' => [
            'imageFile' => 'E:\\OpenServer\\userdata\\temp\\php433.tmp'
        ]
        'error' => [
            'imageFile' => 0
        ]
        'size' => [
            'imageFile' => 1235200
        ]
    ]
] 
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картини профиля.

Сообщение alexa777 »

Dominus писал(а): 2018.02.27, 21:05 А что выдаёт так?

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

public function actionUpload(){
        
       $image = new Images();
      
        if(Yii::$app->request->isPost){
        
            \yii\helpers\VarDumper::dump(Yii::$app->request->post(), 10, 1);
            
            $image->image = UploadedFile::getInstance($image, 'image');
            
            \yii\helpers\VarDumper::dump($image->image, 10, 1);
            die;

            $image->upload();
            return;
       }else {
             return $this->render('index', [
                 'model' => $this->findModel(),
                 'image' => $image,
                 ]);
            
        }
Должно что то типа:

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

[
    '_csrf' => '7qpZzjN9RO8CF1Fz_m1t8kL3s-7QZ36zLKuxJz4aUB_b_Q6hUQh1mDRhYDqkGSmzLL3QqKEfG8JG6eVGckBjZQ=='
    'Images' => [
        'imageFile' => ''
    ]
 yii\web\UploadedFile#1
(
    [name] => '31.01.2018_23-37-17.png'
    [tempName] => 'E:\\OpenServer\\userdata\\temp\\php4E8.tmp'
    [type] => 'image/png'
    [size] => 1235200
    [error] => 0
) 
Если так, то всё в порядке.

Да выдает подобное, Вот я чайник, а я весь день ищу почему в $_POST пусто 'Images' => [
'imageFile' => ''
]

Просто я в Images.php сделал Вардамп, а она ничего не выдает, вот и думал что там пусто

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

public function upload(){
 if($this->validate()){
 var_dump($this->image);
 }else{
 return false;
 }
 }
Спасибо буду двигаться дальше
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картини профиля.

Сообщение alexa777 »

Dominus писал(а): 2018.02.27, 21:31
Все равно какаято фигня, фаил не доходит до модели

Вот экшен, при попытки загрузить картинку выдает не загружен, В чем может быть проблема?

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

public function actionUpload(){
        
       $image = new Images();
      
        if(Yii::$app->request->isPost){
            $image->image = UploadedFile::getInstance($image, 'image');
           if ($image->upload()) {
                
                return $this->redirect(['index']);
            }
            
            echo 'не загружен';
       }else {
             return $this->render('index', [
                 'model' => $this->findModel(),
                 'image' => $image,
                ]); 
        }
}

Почему то тут валидацию не проходит

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

 public function upload()
    {
        if ($this->validate()) { 
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Загрузка картини профиля.

Сообщение andku83 »

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

$image->errors
сморите что там
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Загрузка картини профиля.

Сообщение Dominus »

Ловите

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

\yii\helpers\VarDumper::dump(); die;
дальше, ищите ошибку там, где перестаёт отдавать то что ожидается)

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

public function upload()
    {
        if ($this->validate()) { 
        echo 'OK!';
        die;
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
OK!
Валидация пройдена! Смотрим дальше ...
если нет, смотрим валидацию.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Загрузка картини профиля.

Сообщение alexa777 »

Dominus писал(а): 2018.02.28, 20:47 Ловите

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

\yii\helpers\VarDumper::dump(); die;
дальше, ищите ошибку там, где перестаёт отдавать то что ожидается)

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

public function upload()
    {
        if ($this->validate()) { 
        echo 'OK!';
        die;
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
OK!
Валидация пройдена! Смотрим дальше ...
если нет, смотрим валидацию.

Спасибо нашел ошибку. Другие свойства модели не проходили валидацию, так как я их пока не назначал.

Скажите а где правильнее делать сохранение картинки в модели или в контролере?

И почему при попытки сохранить модель $image->save();
выдает ошибку
finfo_file(/tmp/phpBHDvir): failed to open stream: No such file or directory
Картинка при этом в папке сохраняется, а в базе пусто
Ответить