显示来自存储层的图像5.3

Ahm*_*ssa 3 php laravel

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

路线

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

刀片文件以获取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']) }}" alt="" class="img-responsive">
            </div>
        </section>
Run Code Online (Sandbox Code Playgroud)

调节器

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

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

Anw*_*war 5

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

因此,控制器应返回一个视图,并在其视图中插入文件路径。

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

    return view('yourviewnamehere', ['myFile' => $file]);
}
Run Code Online (Sandbox Code Playgroud)

现在,您的视图将能够访问变量$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
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)

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


gan*_*alf 5

我有同样的问题.关键是,你不能在存储访问的东西,所以它建议在这里你可以简单地做一个symbolic linkpublic/storagestorage/app/public使用此命令php artisan storage:link,然后就可以通过类似这样的公共目录中存储目录访问什么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',
        ],

    ],
];
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 您可以使用该asset()方法访问上传​​的文件.

编辑

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