画像アップロード機能の作成 【CakePHP4】

ウェブサービスでフォームを作成する際に、ユーザロゴ等画像をアップロードするケースがよくあります。

今回はCakePHP4での実装方法について解説していきます。

Cake固有の関数等もあるので通常のPHPとは少々記法が違いますが、割と取り扱いやすいという印象です。

コード全体

テンプレート(フォーム)

 //templates/samples/thumbnail
<form method="post" >
      <input type="file" name="thumbnail">
      <input type="submit" value="送信する">
 </form>

コントローラ(サーバに画像アップロード)

//src/Controller/SamplesController.php

//ランダム文字列生成のために記載。
use Cake\Utility\Text;
//その他必要なものがあれば記載。(TableRegistry等)
use ・・・

class samplesController extends AppController
{
    public function thumbnail(){
        if ($this->request->is('post')){

             //Post送信された画像ファイルを取得
             $thumbnail = $this->request->getData("thumbnail");


             //アップロード画像の有無を確認
             if($thumbnail != "undefined" && $thumbnail->getClientMediaType() != ''){

                //画像ファイルの拡張子を確認
                $type = $thumbnail->getClientMediaType();

                //画像ファイルの種類に応じて拡張子を設定する
                $extension = '';
                switch ($type) {
                    case 'image/jpeg':
                       $extension = '.jpg';
                       break;
                    case 'image/png':
                       $extension = '.png';
                       break;
                 }

                 //ランダム文字列を生成
                 $land = Text::uuid();

                 //画像のパスを生成。webroot/imgにアップする
                 $filePath = WWW_ROOT . "/img/".$land.$extension; 

                 //画像アップロード。
                 $thumbnail->moveTo($filePath);
                     
                 //以下、必要であれば記載。旧画像の削除。
                 //unlink($oldThumbnail);
            }
        }
    }
}

コントローラのコード解説

14行目:画像ファイルの受け取り

 $thumbnail = $this->request->getData("thumbnail");

通常のPostと同様です。

20行目:画像のファイルタイプの確認

 $type = $thumbnail->getClientMediaType();

画像のファイルタイプは以下のように取得できます。
(例)JPEGの場合:image/jpeg

23~31行目:拡張子を指定

$extension = '';
switch ($type) {
   case 'image/jpeg':
       $extension = '.jpg';
       break;
   case 'image/png':
       $extension = '.png';
       break;
}

先ほど取得したファイルタイプに応じて、アップロードする画像の拡張子を設定します。

34行目:ファイル名に指定する、ランダム文字列の生成

$land = Text::uuid();

画像ファイル名はランダムに生成した文字列の方が安全です。既存の画像ファイルとの重複を防ぐためです。

※4行目(use Cake\Utility\Text;)がないとエラーが発生します。

37・40行目:ファイル名の指定と画像アップロード

$filePath = WWW_ROOT . "/img/".$land.$extension; 
$thumbnail->moveTo($filePath);

ディレクトリのパス(WWW_ROOT . “/img/”)、生成したランダム文字列のファイル名($land)、拡張子($extension)を結合して、アップロード先パスを生成します。

ファイル->moveTo(パス)でファイルをアップロードできます。

コメント

タイトルとURLをコピーしました