2017-08-23 4 views
0

Je travaille sur un téléchargement d'image. J'essaie de faire la vérification d'image dans le modèle (comme il se doit, non?), Mais je n'arrive pas à faire fonctionner la validation.CakePHP 3.x - Les valideurs de fichiers lors du téléchargement échouent toujours

Je mets ce qui suit dans 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' 
     ]); 

     //... 
    } 

Pour tester mon contrôleur ressemble (je Codés en dur un fichier existant):

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

Ce fichier est seulement quelques octets, mais après le débogage est $comment montre une erreur dans 'photofile':

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

Alors, pourquoi le validateur échoue-t-il toujours? Est-ce que je l'utilise correctement?

Répondre

2

Eh bien, ce n'est pas un fichier téléchargé, donc c'est généralement le comportement attendu. De plus, une chaîne n'est pas du tout supportée comme une valeur valide, la valeur doit être un tableau de téléchargement de fichier, ou à partir de CakePHP 3.4, un objet qui implémente \Psr\Http\Message\UploadedFileInterface.

Pour les tableaux de téléchargement de fichiers, la règle de validation uploadedFile fournie par CakePHP utilisera is_uploaded_file(), qui échouera pour les fichiers qui n'ont pas été réellement téléchargés, et vous ne pouvez pas les émuler.

A partir de CakePHP 3.4, vous pouvez utiliser les objets UploadedFileInterface comme déjà mentionné. CakePHP exige \Zend\Diactoros\UploadedFile qui fournit une implémentation que vous pouvez utiliser à des fins de test, comme:

$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' 
    ) 
]); 

Cependant, alors que cela passera la validation, vous ne serez pas en mesure de déplacer ce fichier en utilisant UploadedFile::moveTo(), car il utilise move_uploaded_file() , qui à nouveau fonctionne uniquement avec les fichiers qui ont été réellement téléchargés.

validation également regex des types MIME ne fonctionne lorsqu'il est passé comme une chaîne (ce n'est pas documenté actuellement), et il doit être une expression régulière valide délimiteurs y compris, comme

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

préciser Sinon les types exacts que un tableau, à savoir

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

Voir aussi

+0

réponse très claire. J'ai décidé d'utiliser plutôt les validateurs 'fileSize()' et 'mimeType()' car ils produisent des erreurs plus utiles. Votre conseil est toujours applicable aux deux. – Roberto