显示来自存储 laravel 5.3 的图像

Posted

技术标签:

【中文标题】显示来自存储 laravel 5.3 的图像【英文标题】:display image from storage laravel 5.3 【发布时间】:2017-06-18 11:28:57 【问题描述】:

我是 laravel 框架的新手,我想显示存储在 storage 文件夹中的图像。我试过这个

路线

 Route::get('/userimage/filename', [
        'uses' =>'PostController@getUserImage',
        'as' => 'account.image',
    ]);

blade文件获取url并显示图片

 </section>
    @if (Storage::disk('public')->has($user->first_name . '-' . $user->id . '.jpg'))
        <section class="row new-post">
            <div class="col-md-6 col-md-offset-3">
                <img src=" route('account.image', ['filename' => $user->first_name . '-' . $user->id . '.jpg']) "  class="img-responsive">
            </div>
        </section>

控制器

 public function getUserImage($filename)

    $file = Storage::disk('public')->get($filename);
    return new Response($file,200);

如何使用上面的代码显示图像?

【问题讨论】:

我今天早些时候回答了类似的问题。您可以使用same approach。 【参考方案1】:

我遇到了同样的问题。问题是,您无法访问存储中的内容,因此建议here 您可以使用此命令php artisan storage:linksymbolic linkpublic/storage 简单地创建为storage/app/public,然后您可以访问存储中的任何内容通过像这样asset('storage/path_to_file')这样的公共目录的目录, 当然,有时您不可能这样做(例如,当您将项目部署到共享主机时)。如果是这种情况, 您可以尝试将文件上传到公共目录(每个人都可以访问)并使用asset() 方法处理文件 1. 您可以在config/filesystems.php 中的磁盘阵列中简单地定义一个新的磁盘驱动程序。在 laravel 5.4 中,默认定义了三个驱动程序('local''public''s3')。你只需要添加你自己的驱动程序,这里我们称之为'MyDiskDriver'(但你可以随意调用它)。 config/filesystems.php

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => env('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
        ],
        'MyDiskDriver' => [
            'driver' => 'local',
            'root' => public_path('uploads'),
            'url' => env('APP_URL').'/public',
            'visibility' => 'public',
        ],

    ],
];

请注意,对于 'MyDiskDriver','root' 已设置为 public/uploads(这意味着当您使用 Illuminate\Http\UploadedFile 类的 store 方法并将 'MyDiskDriver' 的名称作为第二个参数传递时,laravel会将文件上传到 public/uploads 目录。)

    当您使用 Illuminate\Http\UploadedFile 类的 store 方法时,您可以将新创建​​的磁盘驱动程序的名称(此处为“MyDiskDriver”)作为第二个参数传递,以便 laravel 可以使用它来存储文件,您尝试将其存储在您在“root”(此处为 public/uploads)中指定的目录中。

    您可以使用asset()方法访问上传的文件。

编辑

您可以将.env 中的FILESYSTEM_DRIVER 环境变量的值更改为您刚刚创建的磁盘驱动程序的名称,在我们的例子中为MyDiskDriver,而不是执行第2 步。 这样您就可以轻松更改磁盘驱动程序而无需更改代码,只需更改FILESYSTEM_DRIVER 环境变量的值

【讨论】:

这是最佳答案。我已经看到了许多解决方案,包括 Laravel 文档本身所建议的符号链接解决方案。但这在从一台服务器移动到另一台服务器时会产生问题(因为您需要再次运行该命令)。只需使用公共文件夹作为根创建新磁盘,您就完成了 Great man【参考方案2】:

您的控制器应该处理所有“幕后”过程,并且您的视图只显示 html 和 php 变量。这就是 MVC 模式的要点。

所以你的控制器应该返回一个视图,并在它的视图中注入文件路径。

public function getUserImage($filename)

    $file = Storage::disk('public')->get($filename);

    return view('yourviewnamehere', ['myFile' => $file]);

现在,您的视图将能够访问变量$myFile

<!-- ... -->
    @if (Storage::disk('public')->has($user->first_name . '-' . $user->id . '.jpg'))
        <section class="row new-post">
            <div class="col-md-6 col-md-offset-3">
                <img src=" URL::to('img/' . $myFile) ]) "  class="img-responsive">
            </div>
        </section>
    @endif
<!-- ... -->

我假设public/img/ 中的图像的文件路径,所以请随意更改这部分代码。另外,无论你的变量是否包含后缀.jpg,你都应该添加或不添加。

【讨论】:

【参考方案3】:

Laravel 5 - How to access image uploaded in storage within View?

检查第一个答案,您可以将所有File 的东西替换为Storage

这是我做的一个函数:

public function getUserImage($filename)
    
        $storagepath = $filename;
        if (!Storage::disk('public')->exists($storagepath)) 
            $storagepath = 'defaultuserimage.jpeg';
        
        $path = Storage::disk('public')->getDriver()->getAdapter()->applyPathPrefix($storagepath);

        return Image::make($path)->response();
    

需要干预镜像包。

【讨论】:

以上是关于显示来自存储 laravel 5.3 的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何显示来自Laravel的公共/存储/图像中的图像

laravel 5.3 - 在刀片模板中显示来自 mysql 文本字段的 json 数据

使用 AJAX 在 Laravel 5.3 中删除记录

无法使用 Redis 和 Laravel 5.3 在私有频道上广播通知

如何在 laravel 5.3 中解码 base64

在输入'php artisan storage:link'命令后,如何使用Laravel链接存储文件夹在Heroku上显示图像?