[691] Загрузка файла при помощи CUploadedFile

Уже исправленные репорты или принятые предложения
Закрыто
Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

[691] Загрузка файла при помощи CUploadedFile

Сообщение kosenka »

Наверное всех уже достал, но мистика продолжается...
файл CUploadedFile.php

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

    public function saveAs($file,$deleteTempFile=true)
    {
        if($this->_error===UPLOAD_ERR_OK)// не работает на php 5.2.11
        {
            if($deleteTempFile)
                return move_uploaded_file($this->_tempName,$file);
            else if(is_uploaded_file($this->_tempName))
                return file_put_contents($file,file_get_contents($this->_tempName))!==false;
            else
                return false;
        }
        else
            return false;
    }
 
if($this->_error===UPLOAD_ERR_OK) - не работает
if($this->_error==UPLOAD_ERR_OK) - работает
версия php 5.2.11, yii 1.0.10(1.1b.r1504) проверено на двух разных хостингах

может кто-нибудь проверить на другой версии php ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: мистика продолжается... (CUploadedFile.php)

Сообщение samdark »

Покажите код контроллера. Если минимальный набор для теста соберёте — ещё лучше.
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: мистика продолжается... (CUploadedFile.php)

Сообщение Caveman »

Если
kosenka писал(а):if($this->_error===UPLOAD_ERR_OK) - не работает
if($this->_error==UPLOAD_ERR_OK) - работает
, то это значит, что типы не совпадают.
Учитывая, что UPLOAD_ERR_OK - integer по определению, значит слева приходит строка.
Эта строка (номер ошибки) приходит (по коду) из массива $_FILES
И тут уже ничего не поделаешь, вполне возможна ситуация, что разные версии PHP задают разные типы пришедшим в запросе параметрам...
Думаю, можно оформить как баг, ибо не влезая в код фреймворка изменить ситуацию нельзя.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: мистика продолжается... (CUploadedFile.php)

Сообщение samdark »

И всё-таки код контроллера и тестовый набор не помешал бы…
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: мистика продолжается... (CUploadedFile.php)

Сообщение Caveman »

А там по коду никакие свои контроллеры особо не влияют:

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

foreach($_FILES as $class=>$info)
            self::collectFilesRecursive($class, $info['name'], $info['tmp_name'], $info['type'], $info['size'], $info['error']); 
И вот это самое $info['error'] сравнивается потом...
Тем не менее, посмотреть стоит.
Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

Re: мистика продолжается... (CUploadedFile.php)

Сообщение kosenka »

Sam Dark писал(а):И всё-таки код контроллера и тестовый набор не помешал бы…
Код контроллера:

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

        public function actionCategoryEdit($id=null) // редактируем категорию
        {
                $cmodel=Category::model()->findbyPk($id!==null ? $id : $_GET['id']); // загружаем данные по категории
                if($cmodel===null)// если данные в модели нет - вызываем ошибку
                {
                        throw new CHttpException(404,'The requested page does not exist.');
                }
                
                if($_POST['Category']) // если к нам пришел POST
                {
                        $cmodel->oldImage=$cmodel->txt_image;//сохраняем старую картинку, чтобы не стереть при сохранении модели, если нам не дали новую картинку
                        $cmodel->attributes=$_POST['Category'];//присваиваем данные из POST в модель
                        if($cmodel->validate())//валидируем данные
                        {
                                $txt_image=CUploadedFile::getInstance($cmodel,'txt_image');//а вдруг нам загрузили картинку к категории?
                                if (is_object($txt_image) && get_class($txt_image)==='CUploadedFile')//да, картинку нам все таки загрузили
                                {
                                        $cmodel->txt_image=$txt_image;// присваиваем данные
                                }
                                else
                                {
                                        //картинку нам не дали, восстанавливаем старую картинку
                                        $cmodel->txt_image=$cmodel->oldImage;
                                }
                                if($cmodel->save())//сохраняем модель
                                {
                                        $this->redirect($this->createUrl("admin/category/").'#id'.$_GET['id']);//переносим юзера
                                }
                        }
                }

                //получаем список категорий в виде дерева для <select>
                $categoryTree=Category::model()->categoryGetForEdit(
                                                                        array(
                                                                              'txt_cattyp'=>$cmodel->txt_cattyp,//название доски
                                                                              'id'=>$cmodel->id,//ИД, которые редактируем
                                                                             )
                                                                   );
                // показываем страницу редактирования категории
                // лежит здесь: /themes/[theme_name]/views/category/categoryEdit.php
                $this->render('categoryEdit',array(
                                                   'model'=>$cmodel,
                                                   'categoryTree'=>$categoryTree,
                                                   'update'=>true
                                                   )
                             );
        }
 
Код модели Category:

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

        /**
        * Processing before the record is saved
        */
        protected function beforeSave()
        {
                $imagePath=Yii::getPathOfAlias('webroot').Yii::app()->params['filesUploadPath'];//путь куда сохраняем картинки
                
                //если нам сказали "удалить картинку"
                if(isset($this->deleteImage) and !empty($this->deleteImage))
                {
                        @unlink($imagePath.$this->txt_image);//стираем ее
                        $this->txt_image='';//обнуляем "картинку"
                }
                
                if(is_object($this->txt_image))//тут у нас картинка? да!
                {
                        $pi=pathinfo($this->txt_image->name);//делим на составляющие имя файла (картинки)
                        $file=mktime(date("H"),date("i"),date("s"),date("n"),date("j"),date("Y")).'.'.$pi['extension'];//генерируем случайное имя файла
                        
                        //пытаемся сохранить картинку
                        if(!$this->txt_image->saveAs($imagePath.$file))
                        //if(!move_uploaded_file($this->txt_image->tempName,$imagePath.$file))
                        {
                                //не удалось сохранить картинку
                                $this->addError('txt_image',$this->txt_image->getError());
                                return false;
                        }

                        //*** сюда попали, если загрузка картинки прошла успешно ***
                        //удаляем старую картинку (мы ее получили в AdminControllers->actionCategoryEdit)
                        @unlink($imagePath.$this->oldImage);
                        $this->convertImage($imagePath,$file);//конвертируем картинку с заданными параметрами
                        $this->txt_image=$file;
                }

                if(isset($this->parentСhange) and !empty($this->parentСhange)) // если нам сказали "сменить родительскую категорию"
                {
                        $this->pid=$this->parentСhange_pid;//устанавливаем "родительскую категорию" равной той, что нам передали
                }
                return parent::beforeSave();
        }
 
Я там подписал: " //пытаемся сохранить картинку".

p.s. Попробовал сделать в CuploadedFile.php так: if((int)$this->_error===UPLOAD_ERR_OK) и все заработало. Видимо прав Caveman, что "приходят" разные типы.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [691] Загрузка файла при помощи CUploadedFile

Сообщение samdark »

Закрыто