【问题标题】:Get CDN url from uploaded file via Storage通过存储从上传的文件中获取 CDN url
【发布时间】:2015-04-11 02:51:44
【问题描述】:

我正在使用存储提供程序将文件上传到机架空间,就像这样......

$logo = $request->file('logo');
$content = fopen($logo->getRealPath(), 'r+');

\Storage::disk('cdn')->put('logo.png', $content);

现在,我怎样才能得到上面文件的 url?我一直在寻找API中的方法,似乎不可能。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    我通常将磁盘公共 URL 存储在 config/filesystems.php 文件中。例如:

        'google' => [
            'driver'        => 's3',
            'key'           => env('STORAGE_GOOGLE_KEY'),
            'secret'        => env('STORAGE_GOOGLE_SECRET'),
            'bucket'        => env('STORAGE_GOOGLE_BUCKET'),
            'base_url'      => 'https://storage.googleapis.com',
            'public_url'    => env('STORAGE_GOOGLE_PUBLIC_URL'),
        ],
    

    然后在我的模型中,我为包含文件名的字段定义了一个 mutator:

    public function getAvatarAttribute($value)
    {
        // If avatar isn't a URL, generate it
        if (filter_var($value, FILTER_VALIDATE_URL) !== FALSE) {
            return $value;
        } else {
            $disk = config('filesystems.default');
            return config('filesystems.disks.'.$disk.'.public_url').'/avatars/'.$value;
        }
    }
    

    这让我:

    1. 随时更改默认磁盘并立即将所有引用指向我的新磁盘。
    2. 如果需要,将实际 URL 存储在数据库中。就我而言,头像可能来自 OAuth 或实际文件上传,因此我需要同时兼顾两者。

    【讨论】:

      【解决方案2】:

      这里的问题是FlySystem adapter 的工作方式。

      对于大多数操作,它只会返回一个布尔值,指示操作是否成功。 甚至 Laravel 的 FlySystem 包装器也不会跟踪路径,因此解决方法是在成功上传后自己构建路径。

      通过使用文件系统配置,我们可以想出这样的东西:

      $cdn_url = config('filesystems.disks.cdn.container').'/logo.png';

      你明白了。

      【讨论】:

        【解决方案3】:

        在最近的 Laravel 版本中,您可以自定义存储 URL

        https://laravel.com/docs/8.x/filesystem#url-host-customization

        网址主机自定义

        如果您想为使用生成的文件 URL 预定义主机 Storage 门面,你可以添加一个 url 选项到磁盘的 配置数组:

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],
        

        例如'url' => 'https://cdn.example.com', 或者只是将它添加到 .env 文件中(默认情况下对于 s3 它是 AWS_URL)

        【讨论】:

          猜你喜欢
          • 2020-03-26
          • 2019-10-13
          • 2017-07-08
          • 2015-02-12
          • 2020-09-11
          • 2021-05-11
          • 2012-08-14
          • 1970-01-01
          • 2018-04-09
          相关资源
          最近更新 更多