如何在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 
Interesting Posts