ウェブサービスでフォームを作成する際に、ユーザロゴ等画像をアップロードするケースがよくあります。
今回は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(パス)でファイルをアップロードできます。
コメント