2017-04-26 88 views
0

我想上傳一個非常基本的圖像。這是我的輸入過濾器文件:ZF RenameUpload過濾器不工作

namespace MyNamespace; 

use Zend\InputFilter\InputFilter; 
use Zend\Filter\StringTrim; 
use Zend\Filter\StripTags; 
use Zend\Filter\File\RenameUpload; 
use Zend\Validator\File\Size; 
use Zend\Validator\File\MimeType; 

class MyFilter extends InputFilter 
{ 
    public function __construct() 
    { 
     $this->add(
      [ 
       'name' => 'image', 
       'required' => true, 
       'filters' => [ 
        [ 
         /* 'name' => RenameUpload::class, */ 
         'name' => 'filerenameupload', 
         'options' => [ 
          'target' => './data/uploads/images/.ext', 
          'overwrite' => true, 
          'randomize' => true, 
          'use_upload_extension' => true, 
         ] 
        ] 
       ], 
       'validators' => [ 
        [ 
         'name' => Size::class, 
         'options' => [ 
          'max' => '10MB', 
         ], 
        ], 
        [ 
         'name' => MimeType::class, 
         'options' => [ 
          'mimeType' => [ 
           'image/jpg', 
           'image/jpeg', 
           'image/png' 
          ] 
         ], 
        ], 
       ], 
      ] 
     ); 
    } 
... 

我檢查了$request->getFiles()->toArray()並且上傳的圖像在那裏。在控制器我做:

$postData = array_merge (
    $this->request->getPost()->toArray(), 
    $this->request->getFiles()->toArray() 
); 

$form = new MyForm; 
$form->setInputFilter(new MyFilter); 
$form->setData($postData); 

$form->isValid()      // this returns true. 

當我檢查uploads文件夾,什麼都沒有。這不是文件系統問題,因爲文件夾所有者與運行apache的用戶相同;和權限是755.

我也注意到如果我刪除它想要寫入的文件夾,$form->isValid()仍然返回true

我在做什麼錯?

回答

0

如果您想使用RenameUpload過濾器,請提供正確的上載目錄。像下面

'./data/upload/images/' 

使用array_merge_recursive()代替array_merge()。因爲array_merge() orverrides類似的數組鍵(只保留最後一個)。

並且這會將圖像上傳到由RenameUpload過濾器指定的目標。

<?php 

... 

if($form->isValid()) { 
    // Move uploaded file to the assigned directory. 
    $data = $form->getData(); 

    // Do other stuff 
    ... 
} 
+0

這個問題似乎是調用'getData()'而不是'isValid()'後的「移動」get操作。 –

+0

是的!你是對的!我已經說過** array_merge_recursive()**,因爲如果任何**鍵**與您正在合併的數組相似,它將保留所有值。 – unclexo