Как загрузить файл, используя модель в yii?

#php #yii #image-uploading

#php #yii #загрузка изображений

Вопрос:

я прочитал эту статью http://yiiframework.com/wiki/2 и я сделал все шаг за шагом. но это не работает! это модель, которую я просто копирую, а затем вставляю :

 class Item extends CActiveRecord
{
    public $image;
    // ... other attributes

    public function rules()
    {
        return array(
            array('image', 'file', 'types'=>'jpg, gif, png'),
        );
    }
}
  

мой взгляд точно такой же, как в статье :

 $form = $this->beginWidget(
    'CActiveForm',
    array(
        'id' => 'upload-form',
        'enableAjaxValidation' => false,
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
    )
);

// ...
echo $form->labelEx($model, 'image');
echo $form->fileField($model, 'image');
echo $form->error($model, 'image');
// ...
echo CHtml::submitButton('Submit');
$this->endWidget();
  

и мой контроллер :

 class ItemController extends CController
{
    public function actionCreate()
    {

        $model=new Item;
        if(isset($_POST['Item']))
        {
            $model->attributes=$_POST['Item'];
            $model->image=CUploadedFile::getInstance($model,'image');
            if($model->save())
            {
                $model->image->saveAs(dirname(__FILE__).'/a.txt');
                // redirect to success page

            }
        }
        $this->render('create', array('model'=>$model));
    }
}
  

когда я выбираю изображение (jpg, png или что-то еще), контроллер не видит мой файл, я имею в виду, isset($_FILES['Item']) имеет значение false … я знаю, что это false, потому что я проверял это с помощью var_dump сотен раз :

   public function actionCreate()
    {

        $model=new Item;
        var_dump(isset($_POST['Item']));
...
  

я также проверяю, var_dump(isset($_FILES['Item'])) который также был false .
для всех типов файлов (кроме обычного текстового файла) $_POST['Item'] ) остается пустым.

я проверил свой запрос с помощью сетевой панели firebug (как Firefox, так и chrome), и в запросе был файл. я уже проверял этот вопрос, кажется, это та же проблема, но ответы были бесполезны, потому что CUploadedFile::getInstance и CUploadedFile::getInstanceByName также возвращают null для моего случая

что вы думаете?

Ответ №1:

Проблема не была связана с Yii Framework или моим php-кодом, потому что я просто тестирую один и тот же код на двух разных машинах, и это работает просто отлично. я использую wamp на своем собственном компьютере, и я предполагаю, что проблема была связана с конфигурациями Apache или php.

Ответ №2:

В контроллере измените и используйте следующим образом:

 class ItemController extends CController
{
    public function actionCreate()
    {

        $model=new Item;
        if(isset($_POST['Item']))
        {
            $model->attributes=$_POST['Item'];
            $uploadedFile = CUploadedFile::getInstance($model,'image');
            if($model->save())
            {

                if(!empty($uploadedFile))  // check if uploaded file is set or not
                {

                    if($model->image == null || empty($model->image)){
                        $rnd = rand(0,9999);// generate random number between 0-9999
                        $fileName = "{$rnd}-{$uploadedFile}";
                        $model->image = $fileName;
                    }
                    $uploadedFile->saveAs(dirname(__FILE__)..'/images/'. $model->image);
                    // redirect to success page
                }
            }
        }
        $this->render('create', array('model'=>$model));
    }
}