2015-02-10 71 views
1
从上传的文件中获取CDN网址

我使用的存储提供商将文件上传到Rackspace公司是这样的...通过存储

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

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

现在,我怎么能得到上述文件的网址是什么?我一直在API中寻找一种方法,这似乎是不可能的。

回答

1

这里的问题是这样的FlySystem adapter作品。

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

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

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

你得到的图片。

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'), 
    ], 

然后在我的模型,我定义为包含该文件名称的字段赋值函数:

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或实际文件上传,所以我需要迎合两者。