显示来自存储层的图像5.3

时间:2017-02-01 16:13:29

标签: php laravel

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

路线

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

刀片文件获取网址并显示图片

 </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']) }}" alt="" class="img-responsive">
            </div>
        </section>

控制器

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

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

3 个答案:

答案 0 :(得分:5)

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

config/filesystems.php

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

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

  2. 您可以使用 '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', ], ], ]; 方法访问上传的文件。

  3. 修改

    您可以将asset()中的FILESYSTEM_DRIVER环境变量的值更改为刚刚创建的磁盘驱动程序的名称,而不是执行步骤2,在我们的案例中.env。 这样,只需更改MyDiskDriver环境变量的值

    ,即可轻松更改磁盘驱动程序,而无需更改代码

答案 1 :(得分:4)

你的控制器应该处理所有“幕后”过程,你的视图只显示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) ]) }}" alt="" class="img-responsive">
            </div>
        </section>
    @endif
<!-- ... -->

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

答案 2 :(得分:0)

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();
    }

它需要干预图像包。