92

我一直在尝试使用新的 Flysystem 与 Laravel 5 的集成。我将“本地化”路径存储到数据库,并让 Storage 门面完成路径。例如我存储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') }}" />

但是路径或任何能够检索完整路径的东西都不可用(据我所知)。那么如何返回完整路径?或者,我想知道这是否是设计使然?如果是这样,为什么我不应该能够获得完整的路径?或者,我是不是完全走错了路?

4

13 回答 13

159

存储磁盘的路径是:

$storagePath  = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()

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

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

$storagePath."/myImg.jpg";
于 2015-03-11T14:27:10.627 回答
76

该方法从 Laravel 5.4 开始存在,您可以通过以下方式获得它:

$path = Storage::disk('public')->path($filename);
于 2018-03-28T10:36:53.650 回答
60

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

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

用于Storage::url($filename)获取给定文件的完整路径/URL。请注意,您需要在以下位置设置S3为您的存储文件系统config/filesystems.php'default' => 's3'

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

如您所见,config/filesystems.php'cloud' => 's3'定义了一个参数,它指的是云文件系统。如果您想在本地服务器中维护存储文件夹但在云中检索/存储一些文件,请使用Storage::cloud()相同的文件系统方法,即Storage::cloud()->url($filename).

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

于 2016-04-05T15:24:11.173 回答
9

这就是我让它工作的方式 - 使用环境变量在 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('/');
}
于 2015-03-16T00:25:13.337 回答
8

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

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();
于 2017-08-02T13:28:46.583 回答
5

如果您需要文件的绝对 URL,请使用以下代码:

$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
于 2017-09-26T10:03:08.530 回答
4

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

$url = Storage::disk('public')->url($filename);
$path = public_path($url);
于 2016-07-26T06:49:32.540 回答
3

好吧,几周前我提出了一个非常相似的问题(通过存储从上传的文件中获取 CDN url):我希望 CDN url 在我的视图中显示图像(如您所要求的那样)。

但是,在查看包 API 后,我确认无法执行此任务。所以,我的解决方案是避免使用flysystem. 就我而言,我需要使用 RackSpace。所以,最后决定使用The 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 的解决方案

于 2015-03-10T17:31:19.290 回答
2

存储方式:

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"/>
于 2016-10-10T17:57:20.917 回答
2

我发现的另一个解决方案是:

Storage::disk('documents')->getDriver()->getConfig()->get('url')

将返回带有文档存储基本路径的 url

于 2019-02-19T10:48:15.963 回答
2

这项工作于 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('');
于 2020-08-28T19:45:25.010 回答
0

看看这个:How to use storage_path() to view an image in laravel 4。这同样适用于 Laravel 5:

存储是用于文件系统的,其中大部分是 Web 服务器无法访问的。例如,推荐的解决方案是将图像存储在公共文件夹(即文档根目录)中的某个位置public/screenshots/。然后,当您要显示它们时,请使用asset('screenshots/1.jpg').

于 2015-03-10T13:06:55.827 回答
0

就我而言,我为本地文件制作了单独的方法,在这个文件中: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 可能有人合并这个))

于 2016-05-18T16:18:51.203 回答