こんにちは。からすぱんです。
早いもので入社してから早くも半年が経ちました。夜は寒いのでコートを着て出勤するも朝はそこまでむしろ暑いくらいという、難しい季節となりました。
さて、先日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ですが、ドキュメント通りにはいかないこともありますよね。やはり経験が全てだということを改めて感じました。