如何在Laravel刀片模板文件中显示Blob图像?

时间:2019-03-17 09:40:38

标签: php laravel blob laravel-blade

我想显示数据库中存储为斑点图像的图像。我执行以下操作:

echo '<img src="data:image/JPG;base64,'.base64_encode($item->image).'"/>'; ?>

它给了我错误:

  

由于包含错误,无法显示图像

这就是我的上传方式

$base64 = base64_encode($img);

DB::table('items')->InsertGetId([
        'item'=>$item,
        'des'=>$des,
        'unit_sel'=>$sell,
        'unit'=>$unit,
        'stock'=>$stock,
        'weight'=>$weight,
        'cat'=>$cat,
        'image'=>$base64
    ]);

我使用laravel 5.5。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

I already replied in Reddit,但我将总结三点:

  • 您正在将图像保存到数据库中,除非您知道自己在做什么,否则应该避免这样做,并且为了严格的图像控制,不要在意可伸缩性,资源,性能。
  • 您在刀片模板中使用的是echo而不是双花括号{{ }},这可以允许持久使用XSS atacks
  • 存储图像时,您已经将图像编码为base64。在您的视图代码中,必须使用已经以base64编码的字符串,而不是再次对其进行编码或解码。

答案 1 :(得分:0)

如果您需要将图像存储在数据库中,我建议为图像检索创建一条单独的路径,因为这样浏览器会缓存图像,并避免每次必须显示图像时都查询数据库,并通过很多图像。

我将图像作为BLOB存储在product_id标识的MYSQL PRODUCT表中

刀片:

<img src="/dbimage/{{$product->id}}.png" >

路线:

Route::get('/dbimage/{id}',[ProductImageController::class, 'getImage']);

控制器:

class ProductImageController extends Controller
{

    public function getImage($prodcutImageID){
        $productID=explode(".",$prodcutImageID);
        $rendered_buffer= Product::all()->find($productID[0])->image;

        $response = Response::make($rendered_buffer);
        $response->header('Content-Type', 'image/png');
        $response->header('Cache-Control','max-age=2592000');
        return $response;
    }

}

这使浏览器缓存图像