2017-07-10 40 views
0

現在我對這個ZF3的東西有點更多了。我可以(在一些幫助下)實現我想要的幾乎所有東西。爲了探索新的版本,我開發了一個測試項目。fileupload的輸入過濾器,基本用法

有些問題仍然沒有答案,我沒有找到可用的解釋。

我的新問題是InputFilterAwareInterface。我嘗試了教程中的字符串示例,到目前爲止一切正常。但總是爲了輕鬆的主題找到一切,如果你走得更遠,它會突然結束。

我需要用於xls和xlsx文件的Inputfilter。我當然搜索了一下,閱讀教程,在zend教程中搜索,因爲我有這個想法,必須有某個地方存在一些完整的參考,但我找不到任何。

所以,我想這一個:

$inputFilter->add([ 
       'type'  => 'Zend\InputFilter\FileInput', 
       'name'  => 'DCL_Path', 
       'required' => true, 
       'validators' => [ 
         ['name' => 'FileUploadFile'], 
         [ 
           'name' => 'FileMimeType', 
           'options' => [ 
             'mimeType' => ['text/xls', 'text/xlsx'] 
           ] 
         ], 
         [ 
           'name' => 'Filesize', 
           'options' => [ 
             'max' => 4096 
           ] 
         ], 
       ], 
//    'filters' => [ 
//      [ 
//        'name' => 'FileRenameUpload', 
//        'options' => [ 
//          'target'=>'./data/upload', 
//          'useUploadName'=>true, 
//          'useUploadExtension'=>true, 
//          'overwrite'=>true, 
//          'randomize'=>false 
//        ] 
//      ] 
//    ], 
     ]); 

正如你看到的,我仍然戰鬥驗證的一部分。驗證xls和xlsx文件的正確語法是什麼,最大容量是4MB?

而在這之後,有關filterarea,我做了以下在我的控制器動作,只是因爲我已經習慣了

if ($form->isValid()) { 
        $data = $form->getData(); 
        // Upload path 
        $location = "public/files/"; 
        // A bit validation of uploaded file 
        $allowedExtension = array('xls', 'xlsx'); 
        $extension = explode('.', $data['DCL_Path']['name']); 
        $extension = end($extension); 
        //$import['DCL_Path']=$data['DCL_Path']['name']; 
        //$fileName = time() . '.' . $extension; 
        $fileName = $data['DCL_Path']['name']; 
        // Check if everything is OK! 
        //echo $fileName; 
        if (0 === $data['DCL_Path']['error'] && in_array($extension, $allowedExtension)) { 
         move_uploaded_file($data['DCL_Path']['tmp_name'], $location . $fileName); 
        } else { 
         echo 'Something went wrong!'; 
        } 

是對move_uploaded_file($data['DCL_Path']['tmp_name'], $location . $fileName); obsolet在界面上filterstuff?在這種情況下,語法又將如何?

而我最大的心願之一,也有人知道怎樣的一個教程這也解釋清楚的兩個選項(驗證器和過濾器)的各種可能性和鑰匙的?有時我不相信你需要很多時間才能找到正確的鑰匙。

編輯1:節目形態,filterstuff和變更控制

這裏是部分我的Form類:

<?php 
namespace Import\Form; 

use Zend\Form\Form; 
class ImportForm extends Form 
{ 
    public function __construct($name = null) 
    { 
     // We will ignore the name provided to the constructor 
     parent::__construct('import'); 

     $this->add([ 
       'name' => 'DCLID', 
       'type' => 'hidden', 
     ]); 
     $this->add([ 
       'name' => 'UnitID', 
       'type' => 'text', 
       'options' => [ 
         'label' => 'equipment', 

       ], 
     ]); 
     $this->add([ 
       'name' => 'DCL_Path', 
       'type' => 'File', 
       //'required' => true, 
       'options' => [ 
         'label' => 'path to file', 

       ], 
       //    'name' => 'FileRenameUpload', 
//    'filters' => [ 
//      'target'=>'./public/files', 
//      'useUploadName'=>true, 
//      'useUploadExtension'=>true, 
//      'overwrite'=>true, 
//      'randomize'=>false 
//     ], 
//    'validators' => [  // Validators. 
//      // Put validator info here. 
//    ] 
     ]); 

這裏類的一部分延伸InputFilterAwareInterface

<?php 
namespace Import\Model; 
use DomainException; 
use Zend\Filter\StringTrim; 
use Zend\Filter\StripTags; 
use Zend\Filter\ToInt; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 
use Zend\Validator\StringLength; 

class Import implements InputFilterAwareInterface 
{ 
    public $DCLID; 
    public $DCL_Path; 
    public $Unitname; 
    public $UnitID; 
    public $Importdate; 
    public $Importuser; 
    public $Importok; 
    public $DCL_Type; 
    public $Changed_per_User; 
    public $Description_Changes; 

    private $inputFilter; 

    public function exchangeArray(array $data) 
    { 
     $this->DCLID= !empty($data['DCLID']) ? $data['DCLID'] : null; 
     $this->UnitID= !empty($data['UnitID']) ? $data['UnitID'] : null; 
     $this->DCL_Path= !empty($data['DCL_Path']) ? $data['DCL_Path'] : null; 
     $this->Importdate= !empty($data['Importdate']) ? $data['Importdate'] : null; 
     $this->Importuser= !empty($data['Importuser']) ? $data['Importuser'] : null; 
     $this->Importok= !empty($data['Importok']) ? $data['Importok'] : null; 
     $this->DCL_Type= !empty($data['DCL_Type']) ? $data['DCL_Type'] : null; 
     $this->Changed_per_User= !empty($data['Changed_per_User']) ? $data['Changed_per_User'] : null; 
     $this->Description_Changes= !empty($data['Description_Changes']) ? $data['Description_Changes'] : null; 
    } 

    public function getArrayCopy() 
    { 
     //  echo var_dump(get_object_vars($this) 
     //    ); 

     return get_object_vars($this); 
    } 

    public function setInputFilter(InputFilterInterface $inputFilter) 
    { 
     throw new DomainException(sprintf(
       '%s does not allow injection of an alternate input filter', 
       __CLASS__ 
       )); 
    } 

    public function getInputFilter() 
    { 
     if ($this->inputFilter) { 
      return $this->inputFilter; 
     } 

     $inputFilter = new InputFilter(); 

//  $inputFilter->add([ 
//    'name' => 'DCLID', 
//    'required' => false, 
//    'filters' => [ 
//      ['name' => ToInt::class], 
//    ], 
//  ]); 
     // Validator für das Upload Element 

     $inputFilter->add([ 
       'type'  => 'Zend\InputFilter\FileInput', 
       'name'  => 'DCL_Path', // Element's name. 
       'required' => true, // Whether the field is required. 
       'filters' => [  // Filters. 
         [ 
           'name' => \Zend\Filter\File\RenameUpload::class, 
           'options' => [ 
             'use_upload_extension' => true, 
             'randomize' => false, 
             'overwrite' => true, 
             'target' => 'public/files', 
           ], 
         ], 
       ], 
       'validators' => [  // Validators. 
         [ 
           'name' => \Zend\Validator\File\Extension::class, 
           'options' => [ 
             'extension' => 'xls, xlsx', 
             'message' => 'File extension not match', 
           ], 
         ], 
         [ 
           'name' => \Zend\Validator\File\MimeType::class, 
           'options' => [ 
             'mimeType' => 'text/xls', 'text/xlsx', 
             'message' => 'File type not match', 
           ], 
         ], 
         [ 
           'name' => \Zend\Validator\File\Size::class, 
           'options' => [ 
             'min' => '1kB', // minimum of 1kB 
             'max' => '4MB', 
             'message' => 'File too large', 
           ], 
         ], 
       ] 
     ]); 

和我的一部分我的控制界限,我認爲可能是問題,有些東西可能不是邏輯:

$form = new ImportForm(); 
     $form->get('submit')->setValue('Add'); //Änderung des LAbels des Submit Buttons, um das Form wiederverwenden zu können 
     //echo "hier"; 
     $request = $this->getRequest(); 
     if (! $request->isPost()) {  //wurden Daten über POST geschickt? 
      return ['form' => $form]; //Keine Daten, nur Form anzeigen, nicht verarbeiten 
     } 
     else { 
     //Es wurden Daten gesendet 
      //echo "Daten"; 
      $import = new Import();  //Neue Instanz von Import 
      $form->setInputFilter($import->getInputFilter());  //Filter an Form binden 
      $form->setData($request->getPost());  //Daten abholen 
      //echo $form->isValid(); 
      if (! $form->isValid()) { 
       return ['form' => $form];  //Wenn die Daten nicht valide sind 
      } 
      else{   //aus Tableadapter 
        $import->exchangeArray($form->getData()); 
        $data = array_merge_recursive(
          $this->getRequest()->getPost()->toArray(), 
          $this->getRequest()->getFiles()->toArray() 
          ); 
        $form->setData($data); 
        if ($form->isValid()) { 
         $data = $form->getData(); 
         // Upload path 
       //  $location = "public/files/"; 
//      $allowedExtension = array('xls', 'xlsx'); 
//      $extension = explode('.', $data['DCL_Path']['name']); 
//      $extension = end($extension); 
         $fileName = $data['DCL_Path']['name']; 
//      // Check if everything is OK! 
//      //echo $fileName; 
//      if (0 === $data['DCL_Path']['error'] && in_array($extension, $allowedExtension)) { 
//       move_uploaded_file($data['DCL_Path']['tmp_name'], $location . $fileName); 
//      } else { 
//       echo 'Something went wrong!'; 
//      } 

         //----------------------------------------------------------------- 
         // t_dcl befüllen 
         //----------------------------------------------------------------- 
         //$namen = explode(",", $import); //Konvertierung des Strings in ein Array 
         //echo "<pre>"; var_dump($namen); echo "</pre>"; //Formartierte Ausgabe des Arrays 
         $this->table->saveImport($import); 

EDIT2:controlleraction的後部分討論爲了一些語句:

controlleraction

$form = new ImportForm(); 
     $form->get('submit')->setValue('Add'); 
     $request = $this->getRequest(); 
     if (! $request->isPost()) {  
      return ['form' => $form]; 
     } 
     else { 
      $import = new Import();  //Neue Instanz von Import 
      $form->setInputFilter($import->getInputFilter());  
      $form->setData($request->getPost());   
      $data = array_merge_recursive(
        $this->getRequest()->getPost()->toArray(), 
        $this->getRequest()->getFiles()->toArray() 
        ); 
      $form->setData($data); 
      if (! $form->isValid()) { 
       return ['form' => $form];  
      } 
      else{   
        $import->exchangeArray($form->getData()); 
        $data = $form->getData(); 
        $fileName = $data['DCL_Path']['name']; 

$form->setInputFilter($import->getInputFilter());正確的位置?或者我何時必須綁定Inputfilter才能形成?

有一個小問題,左起:我現在有一個消息:

文件類型不匹配

我試着上傳。XLSX文件

回答

1

請嘗試一下本作InputFilter

 $inputFilter->add([ 
      'type'  => 'Zend\InputFilter\FileInput', 
      'name'  => 'DCL_Path', // Element's name. 
      'required' => true, // Whether the field is required. 
      'filters' => [  // Filters. 
       [ 
        'name' => \Zend\Filter\File\RenameUpload::class, 
        'options' => [ 
         'use_upload_extension' => true, 
         'randomize' => false, 
         'overwrite' => true, 
         'target' => 'public/files', 
        ], 
       ], 
      ], 
      'validators' => [  // Validators. 
       [ 
        'name' => \Zend\Validator\File\Extension::class, 
        'options' => [ 
         'extension' => 'xls, xlsx', 
         'message' => 'File extension not match', 
        ], 
       ], 
       [ 
        'name' => \Zend\Validator\File\MimeType::class, 
        'options' => [ 
         'mimeType' => 'text/xls', 'text/xlsx', 
         'message' => 'File type not match', 
        ], 
       ], 
       [ 
        'name' => \Zend\Validator\File\Size::class, 
        'options' => [ 
         'max' => '4MB', 
         'message' => 'File too large', 
        ], 
       ], 
      ] 
     ]); 

這裏的控制器

if($this->getRequest()->isPost()) { 
     // merge post and files 
     $request = $this->getRequest(); 
     $data = array_merge_recursive(
      $request->getPost()->toArray(), 
      $request->getFiles()->toArray() 
     ); 

     // passing data 
     $form->setData($data); 

     // execute validator 
     if($form->isValid()) { 
      // execute file filters. 
      $data = $form->getData(); 
     } 
    } 

通過使用\Zend\Validator\File\Extension\Zend\Validator\File\MimeType\Zend\Validator\File\FileSize你不需要使用此代碼手動檢查你的位指示。

if (0 === $data['DCL_Path']['error'] && in_array($extension, $allowedExtension)) {} 

因爲驗證將在我們呼叫$form->isValid()時執行。使用\Zend\Filter\File\RenameUpload,您不需要再使用move_uploaded_file()。因爲此過濾器會將上傳的文件移到我們在'target' => 'public/files'選項中定義的目標文件。當我們調用$form->getData();

而關於解釋ValidatorFilter,我建議你創建另一個職位是執行

過濾。通過使用單獨的問題,在搜索引擎中搜索將很容易,並且可以幫助其他人找到它。

+0

第一:您的帖子真的很有幫助,我明白當執行驗證時以及過濾器工作正常時,我的建議是正確的,在重複之前。第二我得到一個錯誤,這可能會很快修復:在插件管理器Zend \ Validator \ ValidatorPluginManager中找不到名爲「Zend \ Validator \ File \ FileSize」的插件我是否必須通過作曲者來獲取它? –

+0

好吧,應該是\ Zend \ Validator \ File \ FilesSize但現在我有一個額外的問題,我選擇了一個文件,提交後我得到這個驗證消息:「值是必需的,不能爲空」 –

+0

對不起, \ Zend \ Validator \ File \ Size'而不是'Zend \ Validator \ File \ FileSize' –