2016-06-29 70 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

我發現它是model-> 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, 
     ]); 

我取消了對模型上傳方法中進行驗證。希望它能幫助別人。