2015-10-18 56 views
3

我不確定這是一個新的錯誤還是發生了什麼,但我無法讓Yii2驗證程序在上傳之後識別文件。客戶端驗證正常工作。Yii2文件驗證上傳失敗後工作

規則模型:

return [ 
     [['store_id', 'name', 'csv'], 'required'], 
     [['store_id', 'created_at', 'updated_at'], 'integer'], 
     [['name'], 'string', 'max' => 255], 
     [['csv'], 'file', 'skipOnEmpty' => false, 'maxSize'=>1024 * 1024 * 2], 
    ]; 

控制器動作:

public function actionUploadFromCsv() 
{ 
    $store = Yii::$app->user->identity->store; 

    $store_csv = new StoreCsv; 
    $store_csv->store_id = $store->id; 
    $store_csv->name = $store_csv->getDefaultName(); 

    if (Yii::$app->request->isPost) { 
     $store_csv->csv = UploadedFile::getInstance($store_csv, 'csv'); 
     if ($store_csv->upload()) { 
      return $this->redirect(['view-csv', 'id'=>$store_csv->id]); 
     } 
     return json_encode($store_csv->getErrors()); 
    } 
    return $this->render('csv_upload', [ 
     'store'=>$store, 
     'csv'=>$store_csv 
    ]); 
} 

模型上傳()函數:

public function upload() 
{ 
    if ($this->validate()) { 
     $file_name = uniqid(rand(), false) . '.' . $this->csv->extension; 
     $this->csv->saveAs(Yii::getAlias('@backend') . '/web/store/' . $this->store_id . '/csv/' . $file_name); 
     $this->csv = $file_name; 
     return $this->save(); 
    } 
    return false; 
} 

組成標記:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> 
    <?= $form->field($csv, 'csv')->fileInput() ?> 

    <div class="form-group"> 
     <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?> 
    </div> 

<?php ActiveForm::end(); ?> 

目前,當我完成上傳我得到這個錯誤驗證失敗後:

{"csv":["Please upload a file."]} 

如果我改變「skipOnEmpty」爲真,但是,它工作正常。它保存模型並移動並重命名臨時文件。我想通過驗證工作,所以我可以限制某些擴展。這是怎麼回事?我花了幾個小時解決這個問題。

回答

7

我想出了我的問題在這裏。保存文件後,我嘗試重命名它,但是,我在這裏執行的方式會將該屬性的關聯作爲文件取消。

錯誤:

$this->csv = $file_name; 

右:

$this->csv->name = $file_name; 

另外,我原來問過這個問題,因爲我遇到了麻煩的驗證工作,限制擴展。當我執行$ model-> validate()時,它不會在客戶端驗證後識別「xls」或「csv」。我剛剛發現,這是一個已知的問題,由於MIME類型驗證: https://github.com/yiisoft/yii2/issues/6148

解決擴展問題是checkExtensionByMimeType設置爲false:

[['csv'], 'file', 'skipOnEmpty' => false, 'extensions'=>['xls', 'csv'], 'checkExtensionByMimeType'=>false, 'maxSize'=>1024 * 1024 * 2], 
+0

感謝您對checkExtensionsByMimeType的建議。我一直在努力。 – nicolascolman

0

什麼是您的FORM標記?在瀏覽器中查看頁面源代碼。除非表格標記具有multipart/form-data,否則將忽略文件。

<form action="upload.php" method="post" enctype="multipart/form-data"> 
+0

我加入吧。此外,如果您閱讀下面的段落,如果我有'skipOnEmpty'=> true,則所有內容都可以上傳並保存。 –

+1

當窗體有文件輸入時,Yii2會自動添加enctype屬性。 – nicolascolman