如何在laravel 5中使用Storage facade获取文件路径?

dav*_*tar 68 php laravel-5 flysystem

我一直在尝试使用与Laravel 5的新Flysystem集成.我正在将"本地化"路径存储到数据库,并使存储外观完成路径.例如,我存储screenshots/1.jpg和使用

Storage::disk('local')->get('screenshots/1.jpg')
Run Code Online (Sandbox Code Playgroud)

要么

Storage::disk('s3')->get('screenshots/1.jpg') 
Run Code Online (Sandbox Code Playgroud)

我可以在不同的磁盘上检索相同的文件.

get 检索文件内容,但我希望在我的视图中使用它,如下所示:

<img src="{{ Storage::path('screenshots/1.jpg') }}" />
Run Code Online (Sandbox Code Playgroud)

但路径,或任何能够检索完整路径的东西都不可用(据我所见).那我怎么能回到完整的路径呢?或者,我想知道这是否是设计的?如果是这样,为什么我不应该能够获得完整的路径?或者,我是否完全以错误的方式解决这个问题?

sho*_*ild 138

存储磁盘的路径是:

$storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
Run Code Online (Sandbox Code Playgroud)

我不知道任何更短的解决方案......

您可以将$ storagePath共享给您的视图,然后只需调用

$storagePath."/myImg.jpg";
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法是使用`applyPathPrefix`这样的:`存储::盘( '本地') - > getDriver() - > getAdapter() - > applyPathPrefix( 'myImg.jpg');` (13认同)
  • 或许很高兴知道,自从Laravel 5.4有一个新的,简单的方法`Storage :: path`,请参阅[Bilal的回答](/sf/answers/3467259631/) (5认同)
  • @maximLanin:不知怎的,如果你复制你的例子,最后一个(applyPathPrefix)在h和P(path*Prefix)之间有一个奇怪的字符.如果您复制粘贴,您将收到错误.你可以复制第一个`applyPathPrefix`.很奇怪.(您可以通过双击示例中的最后一个方法名称来测试它. (3认同)
  • `getDriver()`不需要.只需`Storage :: disk('local') - > getAdapter() - > getPathPrefix()`也可以. (3认同)

Bil*_*kin 50

从Laravel 5.4开始,这个方法就存在了,你可以通过以下方式得到它:

$path = Storage::disk('public')->path($filename);
Run Code Online (Sandbox Code Playgroud)


Per*_*ell 49

编辑:L5.2 +的解决方案

有一个更好,更直接的解决方案.

使用Storage::url($filename)得到给定文件的完整路径/ URL.请注意,您需要将S3存储文件系统设置为config/filesystems.php:'default' => 's3'

当然,你也可以Storage::disk('s3')->url($filename)用同样的方式做.

正如您所看到的,config/filesystems.php还有一个'cloud' => 's3'定义的参数,它指的是Cloud文件系统.如果你想保留本地服务器中的存储文件夹但是检索/存储云使用中的一些文件Storage::cloud(),它们也有相同的文件系统方法,即Storage::cloud()->url($filename).

Laravel文档没有提到这种方法,但是如果你想了解它的更多信息,可以在这里查看它的源代码.

  • **这是L5.2 +** (4认同)

dav*_*tar 8

这就是我如何工作 - 使用环境变量在s3和本地目录路径之间切换,将路径传递给所有视图.

在.env:

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID
Run Code Online (Sandbox Code Playgroud)

在config/filesystems.php中:

'default' => env('APP_FILESYSTEM'),
Run Code Online (Sandbox Code Playgroud)

在app/Providers/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('/');
}
Run Code Online (Sandbox Code Playgroud)


fsa*_*ari 8

如果您只想显示存储(磁盘)路径,请使用以下命令:

Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage
Run Code Online (Sandbox Code Playgroud)

另外,如果您有兴趣,我为 Laravel创建了一个包(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();
Run Code Online (Sandbox Code Playgroud)


小智 5

首先获取文件 url/link 然后是路径,如下:

$url = Storage::disk('public')->url($filename);
$path = public_path($url);
Run Code Online (Sandbox Code Playgroud)