从存储中显示图像 Laravel 5.3

3

我是一名新手,正在学习 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']) }}" alt="" class="img-responsive">
            </div>
        </section>

控制器

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

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

我今天早些时候已经回答了类似的问题。您可以使用相同的方法 - Gayan
4个回答

6
我遇到了同样的问题。问题在于您无法直接访问存储中的内容,所以建议您像这里所建议的那样,通过使用该命令php artisan storage:link,从public/storage创建一个符号链接storage/app/public,然后您就可以通过如下方式asset('storage/path_to_file')通过公共目录访问存储目录中的任何内容。 当然,有时您可能无法这样做(例如当您将项目部署到共享主机时)。如果是这种情况, 您可以尝试上传文件到公共目录(所有人都可以访问),并使用asset()方法来定位文件。 1. 您只需要在config/filesystems.php中的disks数组中定义一个新的磁盘驱动程序。在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()方法访问上传的文件。
编辑:
不必执行第2步,您可以在.env文件中更改FILESYSTEM_DRIVER环境变量的值为您刚刚创建的磁盘驱动器的名称,即MyDiskDriver。这样,您可以轻松更改磁盘驱动器,而无需更改代码,只需更改FILESYSTEM_DRIVER环境变量的值即可。

这是最好的答案。我看过许多解决方案,包括Laravel文档本身建议的符号链接解决方案。但是当从一个服务器移动到另一个服务器时会出现问题(因为您需要再次运行命令)。只需创建以公共文件夹为根目录的新磁盘即可完成。 伟大的人 - sanjay ojha

5
您的控制器应处理所有“幕后”过程,您的视图仅显示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,您都应该添加或不添加它。


0

Laravel 5 - 如何在视图中访问存储中上传的图像?

检查第一个答案,您可以将所有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();
    }

需要安装Intervention Image包。


0
为什么在 Laravel 网站上使用 cetos 服务器存储的图像无法显示,而是显示了这个地址 http://localhost:8000/storage/images/1672938425.jpg
我想展示这张照片。
同时,我使用了以下代码来配置服务文件夹中共享文件夹中的图像:use Illuminate\Support\Facades\Storage;
 class ShareService
    {
        public static function uploadImage($file, $folder)
        {
            $name = time(). '.' . $file->getClientOriginalExtension();
            Storage::disk('public')->putFileAs('images/' . $folder, $file, $name);
    
        $path = asset('storage/images/' . $folder . '/' . $name);
    
        return [$name, $path];
       }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接