CakePHP4で画像データを送信する

こんにちは。からすぱんです。

早いもので入社してから早くも半年が経ちました。夜は寒いのでコートを着て出勤するも朝はそこまでむしろ暑いくらいという、難しい季節となりました。

さて、先日CakePHP4での画像データ送信の実装にかなり詰まってしまったので、備忘録として残しておきたいと思います。誰でも知ってるような常識的なことかもしれませんが、CakePHPでの本格的な開発は初めてですのでご容赦ください。また、誤りがあればご指摘いただければ幸いです。


やりたいこと:動的に生成した画像をbase64 のデータに変換しJson形式でサーバーに送信する。

以下、失敗したソースコードです。

public function index() 
{
    // 画像データをbase64でエンコード
    $img = file_get_contents('C:\image\image.jpg');
    $img_data = 'data:image/jpeg;base64,'.base64_encode($img);

    // jsonに変換
    echo json_encode(['image' => $img_data]);
}

これだと受信側で”parserror”となり、画像が表示されませんでした。

尚、画像データではなく画像パスを同様に送った場合は画像が表示されたので、サイズオーバー等が原因かと推測しています。

次に、CookBookを参考にレスポンスのBodyにデータをセットしようとしました。

public function index() 
{
    ・・・

    // jsonに変換
    // echo json_encode(['image' => $img_data]);

    // レスポンスを取得
    $response = $this->response;

    // jsonレスポンスとしてBodyに画像データをセット
  $response = $response->withType('application/json')
                         ->withStringBody(json_encode(['image' => $img_data]));
}

今度はそもそも受信に失敗してしまいました。Cakebookに書いてあるのに…。

その後はいろいろと調べて試してを繰り返しました。その結果、下記でやっとエラーもなく画像が表示されました。

public function index() 
{
    ・・・

    // jsonに変換
    // echo json_encode(['image' => $img_data]);

    // レスポンスを取得
    $response = $this->response;

    // jsonレスポンスとしてBodyに画像データをセット
  return $this->getResponse()
			          ->withType('json')
			          ->withStringBody(json_encode($resultData));
}

まずレスポンスは getResponse() で取得する必要があるようです。また、Type指定も”json”のみで正常に動作しました。

わからないことがあればすぐに頼ってしまうCakebookですが、ドキュメント通りにはいかないこともありますよね。やはり経験が全てだということを改めて感じました。