我是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);
}
如何使用上面的代码显示图像?
答案 0 :(得分:5)
我遇到了同样的问题。问题是,您无法访问存储中的内容,因此建议here您可以使用此命令{{1}从symbolic link
到public/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将上传该文件/上传目录)。
当您使用Illuminate \ Http \ UploadedFile类的存储方法时,您可以将新创建的磁盘驱动程序的名称(此处为&#39; MyDiskDriver&#39;)作为第二个参数传递,以便laravel可以使用它来存储您在&#39; root&#39;(此处为public / uploads)中指定的目录中存储的文件。
您可以使用 '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',
],
],
];
方法访问上传的文件。
修改强>
您可以将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();
}
它需要干预图像包。