2015-02-10 2 views
1

Я использую поставщика хранилища для загрузки файлов на Rackspace, как так ...Получить CDN URL из загруженного файла с помощью Storage

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

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

Теперь, как я могу получить URL указанного выше файла? Я искал метод в API, и это кажется невозможным.

ответ

1

Проблема здесь то, как FlySystem adapter работы.

Для большинства операций он просто возвращает логическое значение, указывающее, была ли операция успешной или нет. Даже оболочка FlySystem от Laravel также не отслеживает пути, поэтому обходным путем будет создание самого пути после успешной загрузки.

При использовании конфигурации файловой системы, мы можем придумать что-то вроде этого:

$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 или фактических загрузок файлов, поэтому мне нужно обслуживать оба.
Смежные вопросы