2017-08-23 45 views
0

我正在進行圖像上載。我試圖在模型中進行圖像驗證(就像它應該,對吧?),但是我無法驗證工作。CakePHP 3.x - 上傳文件驗證程序始終失敗

我把src/Model/Table/CommentTable如下:

public function validationDefault(Validator $validator) 
    { 
     //... 
     $validator->add('photofile', 'upload', [ 
      'rule' => ['uploadedFile', ['maxSize' => 1048576, 'optional' => true, 'types' => ['image/*']]], 
      'message' => 'Not a valid file' 
     ]); 

     //... 
    } 

爲了測試我的控制器樣子(我硬編碼的現有文件):

$comment = $this->Comments->newEntity([ 
     'body' => $data['body'], 
     'bin_id' => $bin_id, 
     'user_id' => $this->Auth->user('id'), 
     'photofile' => 'C:/Users/Robert/Downloads/test.jpg' 
    ]); 

這個文件只是一個幾個字節,但在調試後$comment在'photofile'中顯示錯誤:

'[errors]' => [ 
    'photofile' => [ 
     'upload' => 'Not a valid file' 
    ] 
], 

那麼爲什麼驗證器總是失敗?我是否正確使用它?

回答

2

嗯,這不是一個上傳的文件,所以這通常是預期的行爲。此外,根本不支持將字符串作爲有效值,該值必須是文件上傳數組,或者自CakePHP 3.4起,該對象實現\Psr\Http\Message\UploadedFileInterface

對於文件上傳陣列,CakePHP提供的uploadedFile驗證規則將利用is_uploaded_file(),這對於沒有真正上傳的文件將會失敗,並且您無法模擬它們。

從CakePHP 3.4開始,您可以使用前面提到的UploadedFileInterface對象。 CakePHP所需\Zend\Diactoros\UploadedFile其中規定,你可以利用用於測試目的的實現,如:

$file = 'C:/Users/Robert/Downloads/test.jpg'; 

$comment = $this->Comments->newEntity([ 
    'body' => $data['body'], 
    'bin_id' => $bin_id, 
    'user_id' => $this->Auth->user('id'), 
    'photofile' => new \Zend\Diactoros\UploadedFile(
     $file, 
     filesize($file), 
     \UPLOAD_ERR_OK, 
     pathinfo($file, \PATHINFO_BASENAME), 
     'image/jpeg' 
    ) 
]); 

但是同時,這將通過驗證,您將無法使用移動即UploadedFile::moveTo()文件,因爲它使用move_uploaded_file() ,它只能用於真正上傳的文件。

MIME類型也正則表達式驗證,只有當作爲字符串傳遞(這個目前未記錄)的作品,而且它必須是包括分隔符有效的正則表達式,像

'types' => '#^image/.+$#' 

或者指定確切的類型,陣列,即

'types' => ['image/jpeg', 'image/png', /* ... */] 

參見

+0

非常明確的答案。我決定使用'fileSize()'和'mimeType()'驗證器,因爲它們會產生更多有用的錯誤。你的建議仍然適用於兩者。 – Roberto