使用 Laravel 5 和 Blade 显示受保护的图像

Show secured images with Laravel 5 and Blade

我不希望用户可以通过简单地使用 URL(例如 http://laravel.dev/123.jpg)来访问图像。因此,我将所有图像存储在 存储目录 中,而不是将它们存储在 public 文件夹中。

有了这样的控制器

public function show($id) {
    $img = storage_path('my_images/123.jpg');
    return response()->download($img, null, [], null);
}

虽然图像存储在 public 文件夹之外,但 Laravel 5 可以正确显示该图像。

到此为止很好...但我想使用 Blade 并在图像周围添加更多细节。因此我的控制器看起来像这样

public function show($id) {
    $picture = Picture::find($id);
    $img = storage_path('my_images/123.jpg');
    return view('pictures.show', array('picture' => $picture, 'img' => $img));
}

这样的视图

<!DOCTYPE html>
<html>
    <head>
        <title>Picture {{ $picture->id }}</title>
    </head>
    <body>
        <h1>Picture {{ $picture->id }}</h1>
        <ul>
            <li>Name: {{ $picture->name }}</li>
            <li>Description: {{ $picture->description }}</li>
        </ul>
        <img src="{{ $image }}">
    </body>
</html>

这显然是行不通的,因为图片的位置 public 无法访问(这是本意)。

我必须使用什么来代替 <img src="{{ $image }}"> 来完成这项工作?

使 src 属性调用第一个控制器的 URL,这对你有用。

换句话说,假设您有一条名为 image.show 的路线,其中包含该代码。

public function show($id) {
    $img = storage_path('my_images/123.jpg');
    return response()->download($img, null, [], null);
}

所以在你的 blade:

<img src={{route("image.show",$img_object)}}">