如何在laravel 5中使用Storage门面获取文件URL?
如何在laravel 5中使用Storage门面获取文件URL?
我一直在使用Laravel 5的新Flysystem集成进行实验。我将“本地化”的路径存储到数据库中,并使用Storage外观来完成路径。例如,我存储了`screenshots/1.jpg`并使用:
Storage::disk('local')->get('screenshots/1.jpg')
或者
Storage::disk('s3')->get('screenshots/1.jpg')
我可以在不同的磁盘上检索相同的文件。`get`方法检索文件内容,但我希望在视图中像这样使用它:
但是,`path`或者任何能够检索完整路径的方法都不可用(就我所知)。那么我该如何返回完整路径呢?或者,我想知道这是设计上的问题吗?如果是这样,为什么我不能获取完整路径?或者,我是不是完全走错了路?
在Laravel 5.2及以上版本中,有一个更好和更直接的解决方法,即使用Storage门面获取给定文件的完整路径/URL。需要在config/filesystems.php
中将存储文件系统设置为S3:'default' => 's3'
。可以使用Storage::url($filename)
或Storage::disk('s3')->url($filename)
来实现。在config/filesystems.php
中还定义了一个'cloud' => 's3'
参数,用于指定云存储文件系统。如果想在本地服务器上维护存储文件夹但在云端检索/存储某些文件,可以使用Storage::cloud()
方法,该方法也具有相同的文件系统方法,例如Storage::cloud()->url($filename)
。
这个解决方法是在Laravel 5.2版本中引入的,但是很高兴现在它已经存在了!Storage类默认在视图中工作,所以你不需要担心这个问题。
这篇文章主要介绍了在Laravel 5.2及以上版本中如何使用Storage门面获取文件URL的解决方法。
问题原因:在Laravel 5中,想要获取文件的URL需要使用Storage门面(Facade),但是在5.4之前的版本中,没有提供直接获取文件URL的方法。
解决方法:在Laravel 5.4及以上的版本中,可以使用Storage门面的path方法来获取文件的路径,然后通过将路径传递给url方法来获取文件的URL。具体代码如下:
$path = Storage::disk('public')->path($filename); $url = Storage::disk('public')->url($path);
通过以上代码,我们可以先获取文件的路径,然后将路径传递给url方法来获取文件的URL。这样就可以方便地获取文件的URL了。
问题出现的原因是用户想要使用Storage门面获取文件的URL,但是他不清楚如何实现。
解决方法有两种:
1. 使用
$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
来获取存储磁盘的路径,然后将$storagePath传递给视图,再通过
$storagePath."/myImg.jpg";
来获取文件的URL。
2. 使用applyPathPrefix
方法,如Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix('myImg.jpg');
来获取文件的URL。
还有一个值得注意的地方是,复制第二种方法时,最后一个方法名(applyPathPrefix)之后会有一个奇怪的字符,如果粘贴该字符,就会出现错误。第一个applyPathPrefix
方法可以正常复制。这是非常奇怪的。(可以通过双击示例中的最后一个方法名来进行测试)
另外,从Laravel 5.4开始,还有一个新的简单方法Storage::path
可以使用,可以参考Bilal's answer。