今回は、コントローラーから画像を出力させる方法をご紹介します。
画像をファイル出力してリンクさせる方法もありますが、一時的な画像の場合は後処理が面倒です。
そこで今回は直接レスポンスでバイナリを返すという方法をご紹介します。
なお、テキストやCSVなどを返す方法は下記が参考になります。
今回は、QRコードを画像として返す方法を試してみようと思います。
前準備
今回は、QRコードを出力するということでendroid/qr-codeを使います。
composer経由でインストールを行います。
# composer require endroid/qr-code
コード
それでは、QRコードを返すアクションを書いてみましょう
//適当なコントローラー内で
use Endroid\QrCode\QrCode;
use Cake\Http\CallbackStream;
//適当なコントローラー内のアクション
public function qrcode(){
$qrCode = new QrCode("QRコードにしたい文字列");
$stream = new CallbackStream(function () use ($qrCode) {
echo $qrCode->writeString();
});
return $this->response->withType($qrCode->getContentType())
->withBody($stream);
}
こんな感じになります。
ImageMagicなど、画像を生成するライブラリも、同じような感じでCallbackStreamを使って画像バイナリを返してあげれば大丈夫かと思います。
CallbackStreamは1回で全部返す必要はなく、細切れで送っても大丈夫なので、動画ファイルなどの大きいファイルでも出力させることができます。