猿问

Laravel 输出服务器端生成的图像的正确模式是什么?

我创建了一条路线,旨在跟踪电子邮件打开情况


Route::get('/stats/{token}/pixel-email-read.png', 

           'StatController@trackEmailRead')

       ->name('stats.pixel-email-read');

我在电子邮件建设中使用它,如下


<img src="{{ route('stats.pixel-email-read', [ 'token' => $order->token ] ) }}">

实际代码正在生成 1x1 透明 ping


public function trackEmailRead(Request $request, string $token)

    {

        header('Content-Type: image/png');

        echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgDTD2qgAAAAASUVORK5CYII=');

    }

它适用于电子邮件,但不适用于浏览器。


如果我打开浏览器我会得到这个

我希望看到浏览器以图像形式打开我的链接。

我究竟做错了什么?


天涯尽头无女友
浏览 105回答 2
2回答

慕虎7371278

如果通往图像的路由和其他内容正确,请使用response()对象助手并加载 base64 图像,最后附加内容类型。想法是这样的:public&nbsp;function&nbsp;trackEmailRead(Request&nbsp;$request,&nbsp;string&nbsp;$token){ &nbsp;&nbsp;&nbsp;&nbsp;$base64_img&nbsp;=&nbsp;base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgDTD2qgAAAAASUVORK5CYII=');&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;response($base64_img)->header('Content-type',&nbsp;'image/png'); }

HUH函数

我将凯文的答案标记为最佳答案,但我添加自己的问题只是为了将来的替代想法。我提供了一个文件而不是回显,就像 mrhn 的评论所建议的那样public function trackEmailRead(Request $request, string $token){&nbsp; &nbsp; $order = Order::where(['token' => $token])->first();&nbsp; &nbsp; if ($order && !$order->email_read_at) {&nbsp; &nbsp; &nbsp; &nbsp; $order->update([&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'email_read_at' => now()&nbsp; &nbsp; &nbsp; &nbsp; ]);&nbsp; &nbsp; }&nbsp; &nbsp; return response()->file(public_path() . '/images/pixel.png');}是的,我知道 !!您认为我可以在 whereNull 条件下使用“email_read_at”进行直接更新,但是......在实际代码中,在查询和 if 之间,还有一些其他业务逻辑......
随时随地看视频慕课网APP
我要回答