質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

3314閲覧

cakephpで画像のバリデーション機能がうまくいかないです。

gomes_2222

総合スコア90

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2020/05/22 08:08

編集2020/05/23 01:49

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リクエストデータの image に入っているものは、\Psr\Http\Message\UploadedFileInterface を実装したオブジェクトで、patchEnitityにより、エンティティオブジェクトにセットされるのも UploadedFileInterface のインスタンスです。

カスタムバリデーションメソッドに渡される $value も実態は UploadedFileInterfaceですので、これに対応した書き方にする必要があります。
(preg_matchの正規表現の書き方も間違ってます。

php

1function ($value) { 2 return preg_match('!^image/(png|pdf|jpeg)$!", $value->getClientMediaType()); 3}

ファイルのアップロード - リクエストとレスポンスオブジェクト - 4.x

なお、ファイルのバリデーションについては、組み込みのバリデーターに便利なルールがありますのでそちらを使用した方がいいでしょう。

cakephp/Validation.php at 4.0.8 · cakephp/cakephp

投稿2020/05/29 13:10

編集2020/05/29 13:11
nojimage

総合スコア957

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nojimage

2020/05/29 13:14 編集

今回のルールなら、`mimeType` ルールが合致しています。
gomes_2222

2020/05/29 15:34

まさに求めていた答えという感じです。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問