2016-06-29 6 views
0

Мой код родственный следующие:Yii2. Ошибка при загрузке файла

Типовые правила

[['documentTypeId', 'itemId', 'name', 'document'], 'required'], 
      [['document'], 'file', 'skipOnEmpty' => false, 'extensions' => ['png', 'jpg', 'doc', 'pdf'], 'checkExtensionByMimeType'=>false], 

метод Модель

public function upload($file) 
    { 
     if ($this->validate()) { 
      $userFolder = Yii::getAlias("@app")."/uploads/".$this->item->userId; 
      if(BaseFileHelper::createDirectory($userFolder) !== false) { 
       $fileName = uniqid(rand(), false) . '.' . $this->document->extension; 
       $file->saveAs($userFolder.'/' . $fileName); 

       $this->document = $file->name; 

       return true; 
      } else { 
       return false; 
      } 

     } else { 
      return false; 
     } 
    } 

Контроллер

$model = new ItemDocument(); 

     if ($model->load(Yii::$app->request->post()) && $model->validate()) { 

      $file = UploadedFile::getInstance($model, 'document'); 

      if($model->upload($file) !== false) { 
       $model->save(); 
      } 

      return $this->redirect(['view', 'id' => $model->id]); 
     } 



     return $this->render('create', [ 
      'model' => $model, 
     ]); 

Это дает мне ошибку проверки: «Документ не может быть пустым». Если я установил поле «Документ» как необязательное и отправлю форму, я получаю «Пожалуйста, загрузите файл».

Я загружаю это через форму с некоторыми другими полями.

Любые идеи?

ответ

2

Я нашел ошибку, которая была модель-> validate() на контроллере. Когда я делаю:

$model->load(Yii::$app->request->post()) 

Содержимое файла не загружается в поле "документ". Yii генерирует скрытое поле, которое пусто. Так что нужно сначала сделать это:

$file = UploadedFile::getInstance($model, 'document'); 

Так что теперь мой контроллер выглядит следующим образом:

$model = new ItemDocument(); 

     if ($model->load(Yii::$app->request->post())) { 

      $model->document = UploadedFile::getInstance($model, 'document'); 

      if($model->validate()) { 

       if ($model->upload() !== false) { 
        $model->save(); 
       } 

       return $this->redirect(['view', 'id' => $model->id]); 
      } 
     } 

     return $this->render('create', [ 
      'model' => $model, 
     ]); 

И я удалил проверку внутри метода загрузки на модели. Надеюсь, это поможет кому-то.

Смежные вопросы