2016-06-29 16 views
0

Zusammenhang My-Code ist der folgende:Yii2. Fehler beim Upload-Datei

Modell Regeln

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

Modell Methode

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; 
     } 
    } 

-Controller

$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, 
     ]); 

Dies gibt mir einen Validierungsfehler: "Dokument kann nicht leer sein". Wenn ich das Feld "Dokument" als nicht erforderlich einstelle und das Formular abschicke, bekomme ich "Bitte Datei hochladen".

Ich lade dies über ein Formular mit einigen anderen Feldern.

Irgendwelche Ideen?

Antwort

2

Ich habe den Fehler gefunden, es war das Modell-> validate() auf Controller. Wenn ich Folgendes tue:

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

Dateiinhalt wird nicht in das Feld "Dokument" geladen. Yii erzeugt ein verstecktes Feld, das leer ist. Also muss ich zuerst, dies zu tun:

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

So jetzt mein Controller sieht wie folgt aus:

$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, 
     ]); 

Und ich entfernt, um die Validierung innerhalb Upload-Methode nach Modell. Hoffe es hilft jemandem.