如何在 laravel 5 中使用 Storage facade 获取文件 URL?
How to get file URL using Storage facade in laravel 5?
我一直在尝试使用新的 Flysystem 与 Laravel 5 集成。我正在存储 'localised' 到数据库的路径,并让 Storage facade 完成路径。例如我存储 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') }}" />
但是路径或任何能够检索完整路径的东西都不可用(据我所知)。那么我怎样才能 return 完整路径呢?或者,我想知道这是否是设计使然?如果是这样,为什么我不能获得完整路径?或者,我是不是用完全错误的方式来解决这个问题?
看看这个:How to use storage_path() to view an image in laravel 4。同样适用于 Laravel 5:
存储用于文件系统,Web 服务器无法访问其中的大部分内容。推荐的解决方案是将图像存储在 public 文件夹(文档根目录)的某个位置,例如 public/screenshots/
。
然后当你想显示它们时,使用asset('screenshots/1.jpg')
。
好吧,几周前我提出了一个非常相似的问题 (Get CDN url from uploaded file via Storage):我希望 CDN url 在我的视图中显示图像(如您所要求的那样)。
但是,在查看包后 API 我确认无法执行此任务。所以,我的解决方案是避免使用 flysystem
。就我而言,我需要使用 RackSpace。因此,最终决定创建我的使用包并使用 The PHP SDK for OpenStack.
制作我自己的存储包
通过这种方式,您可以完全访问所需的功能,例如 getPublicUrl()
,以便从 cdn 容器中获取 public 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的解决方案
存储磁盘的路径为:
$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
我不知道有什么更短的解决方案...
您可以将 $storagePath 共享到您的视图,然后只需调用
$storagePath."/myImg.jpg";
这就是我让它工作的方式 - 使用环境变量在 s3 和本地目录路径之间切换,将路径传递给所有视图。
在 .env 中:
APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID
在config/filesystems.php:
'default' => env('APP_FILESYSTEM'),
在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('/');
}
编辑:L5.2+
的解决方案
有更好更直接的解决方案。
使用 Storage::url($filename)
获取给定文件的完整 path/URL。请注意,您需要将 S3
设置为 config/filesystems.php
中的存储文件系统:'default' => 's3'
当然你也可以用同样的方法Storage::disk('s3')->url($filename)
正如您在 config/filesystems.php
中看到的,还定义了一个参数 'cloud' => 's3'
,它指的是云文件系统。如果您想在本地服务器中维护存储文件夹,但 retrieve/store 云中的一些文件使用 Storage::cloud()
,它也具有相同的文件系统方法,即 Storage::cloud()->url($filename)
.
Laravel文档没有提到这个方法,但是如果你想了解更多可以查看它的源代码here.
就我而言,我在这个文件中为本地文件制作了单独的方法:
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');
}
}
然后,我创建了对框架的拉取请求,但它仍然没有合并到主核心中:
https://github.com/laravel/framework/pull/13605
可能有人合并这个))
先获取文件url/link,然后获取路径,如下:
$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::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage
此外,如果您有兴趣,我为 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();
如果您需要文件的绝对 URL,请使用以下代码:
$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
此方法从Laravel 5.4开始存在,您可以通过以下方式获取:
$path = Storage::disk('public')->path($filename);
我找到的另一个解决方案是:
Storage::disk('documents')->getDriver()->getConfig()->get('url')
请问return将url文件的基本路径存储
我 2020 年在 laravel 7
工作
$image_resize = Image::make($image->getRealPath());
$image_resize->resize(800,600);
$image_resize->save(Storage::disk('episodes')->path('') . $imgname);
所以你可以这样使用它
echo Storage::disk('public')->path('');
我一直在尝试使用新的 Flysystem 与 Laravel 5 集成。我正在存储 'localised' 到数据库的路径,并让 Storage facade 完成路径。例如我存储 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') }}" />
但是路径或任何能够检索完整路径的东西都不可用(据我所知)。那么我怎样才能 return 完整路径呢?或者,我想知道这是否是设计使然?如果是这样,为什么我不能获得完整路径?或者,我是不是用完全错误的方式来解决这个问题?
看看这个:How to use storage_path() to view an image in laravel 4。同样适用于 Laravel 5:
存储用于文件系统,Web 服务器无法访问其中的大部分内容。推荐的解决方案是将图像存储在 public 文件夹(文档根目录)的某个位置,例如 public/screenshots/
。
然后当你想显示它们时,使用asset('screenshots/1.jpg')
。
好吧,几周前我提出了一个非常相似的问题 (Get CDN url from uploaded file via Storage):我希望 CDN url 在我的视图中显示图像(如您所要求的那样)。
但是,在查看包后 API 我确认无法执行此任务。所以,我的解决方案是避免使用 flysystem
。就我而言,我需要使用 RackSpace。因此,最终决定创建我的使用包并使用 The PHP SDK for OpenStack.
通过这种方式,您可以完全访问所需的功能,例如 getPublicUrl()
,以便从 cdn 容器中获取 public 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的解决方案
存储磁盘的路径为:
$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
我不知道有什么更短的解决方案...
您可以将 $storagePath 共享到您的视图,然后只需调用
$storagePath."/myImg.jpg";
这就是我让它工作的方式 - 使用环境变量在 s3 和本地目录路径之间切换,将路径传递给所有视图。
在 .env 中:
APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID
在config/filesystems.php:
'default' => env('APP_FILESYSTEM'),
在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('/');
}
编辑:L5.2+
的解决方案有更好更直接的解决方案。
使用 Storage::url($filename)
获取给定文件的完整 path/URL。请注意,您需要将 S3
设置为 config/filesystems.php
中的存储文件系统:'default' => 's3'
当然你也可以用同样的方法Storage::disk('s3')->url($filename)
正如您在 config/filesystems.php
中看到的,还定义了一个参数 'cloud' => 's3'
,它指的是云文件系统。如果您想在本地服务器中维护存储文件夹,但 retrieve/store 云中的一些文件使用 Storage::cloud()
,它也具有相同的文件系统方法,即 Storage::cloud()->url($filename)
.
Laravel文档没有提到这个方法,但是如果你想了解更多可以查看它的源代码here.
就我而言,我在这个文件中为本地文件制作了单独的方法: 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');
}
}
然后,我创建了对框架的拉取请求,但它仍然没有合并到主核心中: https://github.com/laravel/framework/pull/13605 可能有人合并这个))
先获取文件url/link,然后获取路径,如下:
$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::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg
Storage::disk('local')->url(''): // storage
此外,如果您有兴趣,我为 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();
如果您需要文件的绝对 URL,请使用以下代码:
$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
此方法从Laravel 5.4开始存在,您可以通过以下方式获取:
$path = Storage::disk('public')->path($filename);
我找到的另一个解决方案是:
Storage::disk('documents')->getDriver()->getConfig()->get('url')
请问return将url文件的基本路径存储
我 2020 年在 laravel 7
工作 $image_resize = Image::make($image->getRealPath());
$image_resize->resize(800,600);
$image_resize->save(Storage::disk('episodes')->path('') . $imgname);
所以你可以这样使用它
echo Storage::disk('public')->path('');