如何在laravel 5中使用存储外观获取文件path?
我一直在尝试使用与Laravel 5集成的新Flysystem。我将“本地化”path存储到数据库,并使存储外观完成path。 例如我存储screenshots/1.jpg
和使用
Storage::disk('local')->get('screenshots/1.jpg')
要么
Storage::disk('s3')->get('screenshots/1.jpg')
我可以在不同的磁盘上检索相同的文件。
get
检索文件的内容,但我希望在我这样的看法中使用它:
<img src="{{ Storage::path('screenshots/1.jpg') }}" />
但path或任何能够检索完整path的内容都不可用(据我所见)。 那么我怎样才能返回完整的path呢? 或者,我想知道这是否是devise? 如果是这样,为什么我不能够得到完整的path? 或者,我是否完全错误地进行了这个?
编辑:L5.2 +的解决scheme
有一个更好,更直接的解决scheme。
使用Storage::url($filename)
获取给定文件的完整path/ URL。 请注意,您需要在config/filesystems.php
中将S3
设置为您的存储文件config/filesystems.php
: 'default' => 's3'
当然,你也可以用同样的方法来执行Storage::disk('s3')->url($filename)
。
正如你可以在config/filesystems.php
看到的那样,还有一个参数'cloud' => 's3'
,它是指云文件系统。 如果你想保存在本地服务器的存储文件夹,但检索/存储在云中的一些文件使用Storage::cloud()
,它也有相同的文件系统方法,即Storage::cloud()->url($filename)
。
Laravel文档没有提到这个方法,但是如果你想知道更多的信息,你可以在这里查看它的源代码。
存储磁盘的path是:
$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
我不知道任何简短的解决scheme…
你可以共享$存储path到你的意见,然后只是打电话
$storagePath."/myImg.jpg";
这是我得到它的工作 – 切换s3和本地目录path与环境variables,传递path到所有视图。
在.env中:
APP_FILESYSTEM=local or s3 S3_BUCKET=BucketID
在config / filesystems.php中:
'default' => env('APP_FILESYSTEM'),
在应用/提供者/ AppServiceProvider中:
public function boot() { view()->share('dynamic_storage', $this->storagePath()); } protected function storagePath() { if(Storage::getDefaultDriver() == 's3') { return Storage::getDriver() ->getAdapter() ->getClient() ->getObjectUrl(env('S3_BUCKET'), ''); } return URL::to('/'); }
好吧,几个星期前,我做了一个非常类似的问题( 通过存储从上传的文件中获取CDNurl ):我希望CDNurl在我的视图中显示图像(正如您所要求的那样)。
但是,在查看包API后,我确认没有办法做这个任务。 所以,我的解决scheme是避免使用flysystem
。 就我而言,我需要玩RackSpace。 所以,最后决定创build我的使用包,并使用PHP SDK for OpenStack制作我自己的存储包。
通过这种方式,您可以像getPublicUrl()
一样获取需要的函数,以便从cdn容器获取公共URL:
/** @var DataObject $file */ $file = \OpenCloud::container('cdn')->getObject('screenshots/1.jpg'); // $url: https://d224d291-8316ade.ssl.cf1.rackcdn.com/screenshots/1.jpg $url = (string) $file->getPublicUrl(UrlType::SSL);
总之,如果需要将存储服务提升到另一个层次,那么flysystem
是不够的。 为了local
目的,你可以试试@ nXu的解决scheme
首先获取文件的URL /链接,然后path,如下所示:
$url = Storage::disk('public')->url($filename); $path = public_path($url);
存储方法:
public function upload($img){ $filename = Carbon::now() . '-' . $img->getClientOriginalName(); return Storage::put($filename, File::get($img)) ? $filename : ''; }
路线:
Route::get('image/{filename}', [ 'as' => 'product.image', 'uses' => 'ProductController@getImage', ]);
控制器:
public function getImage($filename) { $file = Storage::get($filename); return new Response($file, 200); }
视图:
<img src="{{ route('product.image', ['filename' => $yourImageName]) }}" alt="your image"/>
看看这个: 如何使用storage_path()在laravel 4中查看图像 。 这同样适用于Laravel 5:
存储是用于文件系统的,大部分是Web服务器无法访问的。 推荐的解决scheme是将图像存储在公共文件夹(这是文档根目录)中的某处,例如在public/screenshots/
中。 然后当你想显示它们时,使用asset('screenshots/1.jpg')
。
在我的情况下,我做了本地文件的单独的方法,在这个文件:src / Illuminate / Filesystem / FilesystemAdapter.php
/** * Get the local path for the given filename. * @param $path * @return string */ public function localPath($path) { $adapter = $this->driver->getAdapter(); if ($adapter instanceof LocalAdapter) { return $adapter->getPathPrefix().$path; } else { throw new RuntimeException('This driver does not support retrieving local path'); } }
然后,我创build拉框请求,但它仍然没有合并到主核心: https : //github.com/laravel/framework/pull/13605可能有人合并这一个))
如果你只是想显示存储(磁盘)path使用这个:
Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg Storage::disk('local')->url(''): // storage
此外,如果您有兴趣,我只为Laravel创build一个包( https://github.com/fsasvari/laravel-uploadify ),以便您可以在Eloquent模型字段上使用所有这些字段:
$car = Car::first(); $car->upload_cover_image->url(); $car->upload_cover_image->name(); $car->upload_cover_image->basename(); $car->upload_cover_image->extension(); $car->upload_cover_image->filesize();
如果您需要文件的绝对URL,请使用以下代码:
$file_path = \Storage::url($filename); $url = asset($file_path); // Output: http://example.com/storage/filename.jpg