前提・実現したいこと
cakephpで、いわゆる会員登録画面を作成しています。
会員登録画面にアイコン画像を登録するようにします。
その際に、アップロードされたファイルがjpgかpdfかpngのファイル形式なのか判別して、当てはまらない場合はエラー返すようにしたいです。
発生している問題・エラーメッセージ
バリデーションがそもそも機能しません。jpgかpdfかpng以外のファイルをアップロードしようとすると、そのまま登録されてしまいます。
該当のソースコード
UserTable
1<?php 2 3namespace App\Model\Table; 4 5use Cake\ORM\Query; 6use Cake\ORM\RulesChecker; 7use Cake\ORM\Table; 8use Cake\Validation\Validator; 9 10use Cake\Error\Debugger; 11 12class UsersTable extends Table 13{ 14public function validationDefault(Validator $validator): Validator 15 {$validator 16 ->requirePresence('image', 'create') 17 ->notEmptyFile('image') 18 ->add('image','costom', 19 [ 20 'rule' => function($value){ 21 return preg_match("image/png" || "image/pdf" || "image/jpeg", $value) === 1; 22 }, 23 'message' => 'ファイルの形式が違います',]); 24 25return $validator; 26 }
controller
1<?php 2namespace App\Controller; 3 4use App\Controller\AppController; 5use Cake\Event\EventInterface; 6use Exception; 7use Cake\Filesystem\Folder; 8use Cake\Filesystem\File; 9use RuntimeException; 10 11class UserController extends AppController 12{ 13public function add() 14 { 15 $user = $this->Users->newEmptyEntity(); 16 if($this->request->is('post')) { 17 $file = $this->request->getData('image'); 18 $file_type = $file->getClientMediaType(); 19 $filePath = WWW_ROOT. date("YmdHis") . $file->getClientFilename(); 20 $data = array( 21 'name' => $this->request->getData('name'), 22 'image' => date("YmdHis") . $file ->getClientFilename() 23 ); 24 25 $user = $this->Users->patchEntity($biditem,$data); 26 if($this->Users->save($user)) { 27 $file->moveTo($filePath); 28 $this->Flash->success(__('保存しました。')); 29 return $this->redirect(['action' =>'index']); 30 } 31 $this->Flash->error(__('保存に失敗しました。もう一度入力下さい。')); 32 } 33 $this->set(compact('user')); 34 }
add.php
1<?= $this->Form->create($user,['type'=>'file'],'multiple') ?> 2<fieldset> 3 echo $this->Form->control('name'); 4 echo $this->Form->control('image',['type' => 'file','required' => true,]); 5 ?> 6</fieldset> 7<?= $this->Form->button(__('Submit')) ?> 8<?= $this->Form->end() ?>
試したこと
自分なりに色々調べて、カスタムバリデーションで実装する方法をやってみましたがダメでした。
自分の頭では、「UsersTable.php」の$valueにコントローラーの$file_typeの値を入れて、検証するというのが自分の頭の中の理想ですが、うまくいかないようです。
補足情報(FW/ツールのバージョンなど)
cakephp4
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/29 13:14 編集
2020/05/29 15:34