显示来自存储 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:link
将symbolic link
从public/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 5.3 - 在刀片模板中显示来自 mysql 文本字段的 json 数据
无法使用 Redis 和 Laravel 5.3 在私有频道上广播通知
在输入'php artisan storage:link'命令后,如何使用Laravel链接存储文件夹在Heroku上显示图像?