【问题标题】:Show secured images with Laravel 5 and Blade使用 Laravel 5 和 Blade 显示安全图像
【发布时间】:2017-01-07 01:36:13
【问题描述】:

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

有了这样的控制器

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

尽管图像存储在公用文件夹之外,但 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>

这显然行不通,因为图像的位置不可公开访问(这是本意)。

我必须使用什么来代替 &lt;img src="{{ $image }}"&gt; 才能完成这项工作?

【问题讨论】:

    标签: laravel-5 blade laravel-blade


    【解决方案1】:

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

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

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

    所以在你的刀片中:

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

    【讨论】:

    • 这样就行了!谢谢你。我唯一不太喜欢这个解决方案的是,客户端实际上会调用服务器两次——第一次是整个页面,第二次是检索图像。有没有办法简单地将图像传输为像&lt;img binary="01001010101..."&gt; 这样的二进制文件,而不是提供源代码?
    • 实际上,您在页面中托管的任何资源(图像、css、js)都是这种情况,客户端将为每个资源发出另一个服务器请求。
    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 2019-06-23
    • 2017-10-07
    • 2021-09-04
    • 2018-05-28
    • 1970-01-01
    • 2021-03-08
    • 2018-04-25
    相关资源
    最近更新 更多