通过存储从上传的文件中获取CDN网址

时间:2015-02-10 21:44:34

标签: php laravel laravel-5

我正在使用存储提供商将文件上传到rackspace,就像这样......

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

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

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

3 个答案:

答案 0 :(得分:2)

我通常将磁盘公共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或实际文件上传,所以我需要满足两者。

答案 1 :(得分:1)

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

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

通过使用文件系统配置,我们可以提出如下内容:

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

你明白了。

答案 2 :(得分:0)

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

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

URL主机自定义

如果您想为主机预定义使用生成的文件URL 在Storage Facade上,您可以在磁盘的 配置数组:

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

示例'url' => 'https://cdn.example.com',或仅将其添加到.env文件(对于s3,默认为AWS_URL)