2013-07-23 67 views
0

我有什麼看起來在Yii內的一些奇怪的行爲。Yii驗證與文件上傳失敗

我有一個簡單的文件上傳,需要一個name和文件本身。

如果我只是提交沒有名稱或文件的表單,我可以繞過驗證(即 - 我的控制器操作被調用,並且正在嘗試處理上傳的文件)我認爲我的規則()會相應地設置來停止此操作。這些是我的相關規則:

public function rules() { 
    return array(
     array('name file', 'required', 'message' => 'This field is required'), 
     array('file', 'file', 'on' => 'insert', 'allowEmpty' => false, 'safe'=>true, 
      'maxSize'=> 512000, 
      'maxFiles'=> 1, 
      'mimeTypes' => 'application/msword, text/plain', 
      'tooLarge'=> 'file cannot be larger than 500KB.', 
      'wrongMimeType'=> 'Format must be: .doc .txt' 
     ), 

我指定該文件是必需的,並且在文件數組中,allowEmpty應該是false。那麼我在這裏做錯了什麼?

預先感謝任何幫助

控制器

public function actionCreate() { 

    $model = new File; 

    if (isset($_POST['File'])) { 

     $model->setAttributes($_POST['File']); 

     // Set file 
     $model->file = CUploadedFile::getInstance($model,'file'); 

     // Set directory 
     $dest = Yii::getPathOfAlias('application.uploads'); 

     $model->tmp_name = time(); 
     $model->date_added = new CDbExpression('NOW()'); 
     $model->file_type = $model->file->type; 
     $model->file_size = $model->file->size; 
     $model->extension = $model->file->extensionName; 


     if ($model->save()) { 

      $model->file->saveAs(($dest . '/' . $model->tmp_name . '.' . $model->file->extensionName)); 

      Yii::app()->user->setFlash('success','<strong>Success!</strong> Your file has been uploaded'); 


     } 
    } 

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

請同時將控制器操作代碼添加到您的問題中。 –

回答

0

對我來說,我發現如果我在處理上傳的文件之前驗證它的工作。當時不明白爲什麼我必須這樣做,因爲我認爲save()方法會自動調用validate()方法

Validation will be performed before saving the record. If the validation fails, the record will not be saved. You can call getErrors() to retrieve the validation errors.

更新代碼

public function actionCreate() { 

    $model = new File; 

    if (isset($_POST['File'])) { 

     $model->setAttributes($_POST['File']); 

    if($model->validate()){ // add in validation call 

     // Set file 
     $model->file = CUploadedFile::getInstance($model,'file'); 

     // Set directory 
     $dest = Yii::getPathOfAlias('application.uploads'); 

     $model->tmp_name = time(); 
     $model->date_added = new CDbExpression('NOW()'); 
     $model->file_type = $model->file->type; 
     $model->file_size = $model->file->size; 
     $model->extension = $model->file->extensionName; 


     if ($model->save()) { 

      $model->file->saveAs(($dest . '/' . $model->tmp_name . '.' . $model->file->extensionName)); 

      Yii::app()->user->setFlash('success','<strong>Success!</strong> Your file has been uploaded'); 


      } 
     } 
    } 

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

希望幫助的人,謝謝@MichaelHärtl

1

對於一個你在namefile之間的第一條規則缺少,。然後你說:

我可以繞過驗證(即 - 我的控制器動作被稱作......

,從我假設你使用AJAX驗證,並期望上傳失敗,但你可以。 「做T AJAX驗證的文件上傳CActiveForm

所以,如果你解決上面的錯字,你至少獲得了name屬性AJAX驗證。

你也許應該也刪除'on'=>'insert'方案。而且您不需要'safe'=>true,因爲您不需要使用$model->file屬性進行大規模分配。

+0

謝謝,我確實想念','。不,我的表單實際上有'enableAjaxValidation'=> false。如果我添加一個文件上傳並將'name'留空並提交,我會收到一個錯誤,說'name'是必需的。如果我填入'name'並且將文件留空,它就會發生這種情況,它只是試圖處理表單。 (更新)控制器) - 謝謝 – Jonnny

+1

嗯。更新了答案。見最後2句話。 –

+0

仍然是相同的結果。 – Jonnny