0

AimLaravel Filesystem/хранения - Местные/Public URL-файлов не работает

Привет, Я использую Laravel для RESTful API. Я хотел бы вернуть пользователям URL-адрес файла изображения. В настоящее время я использую локальное хранилище, но я настроил экземпляр Amazon S3 и синхронизировал с ним свои изображения. Моя цель состоит в том, чтобы легко переключаться между локальным хранением и s3, просто изменив первую строку в моей конфигурации/filesystems.php:

'default' => 'public', 

Подробности

Я настроил Laravel для доступа как локальный диск и S3 через файл config/filesystems.php. В соответствии с инструкциями laravel у меня есть softlinked public/storage to storage/app/public. Вот диски массива из моей конфигурации/filesystems.php:

'disks' => [ 

//  'local' => [ 
//   'driver' => 'local', 
//   'root'  => storage_path('app'), 
//  ], 

     'public' => [ 
      'driver'  => 'local', 
      'root'   => storage_path('app/public'), 
      'visibility' => 'public', 
     ], 

     's3' => [ 
      'driver' => 's3', 
      'key'  => '...', 
      'secret' => '...', 
      'region' => '...', 
      'bucket' => 'mybucket', 
     ], 
    ], 

Это моя иерархия папок:

на локальном диске:

  • myLaravelApp/хранение/мобильный/фоны/
  • myLaravelApp/storage/mobile/closetimages/
  • myLaravelApp/storage/mobile/profileimages/

На S3

  • mybucket/мобильный/фоны/
  • mybucket/мобильный/closetimages/
  • mybucket/мобильный/profileimages/

Как я уже говорил ранее, я бы как легко переключаться между локальным хранилищем и s3, просто изменив первую строку в моей config/filesystems.php:

'default' => 'public', 

, и я надеялся использовать следующий вызов функции для возврата данных пользователя:

return Storage::url('mobile/profileimages/12345.jpg'); 

Когда я делаю этот вызов с s3 как по умолчанию, ответ таков:

https://s3.amazonaws.com/mybucket/mobile/profileimages/12345.jpg

Что отличное! Однако, когда я делаю этот звонок с локальным хранилищем по умолчанию, ответ:

/storage/mobile/profileimages/12345.JPG

Который даже не полный URL :(Что я хотел бы вернуться что-то вроде:

http://mywebapp/storage/mobile/profileimages/12345.jpg

Но я хотел бы тот же вызов работать как для s3 и локального хранения так что я могу переключаться.

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

Спасибо

ответ

2

Вы можете попробовать что-то вроде этого

function public_url($path = '') 
{ 
    $fs = app('filesystem'); 

    if ($fs->getDriver()->getAdapter() instanceof \League\Flysystem\Adapter\Local) { 
     return asset($fs->url($path)); 
    } 

    return $fs->url($path); 
} 

Вы можете использовать его как этот

$assetUrl = public_url('mobile/profileimages/12345.jpg'); 
+0

Это выглядит великолепно. У вас есть какая-либо рекомендация относительно того, где поставить эту функцию в рамках моего проекта laravel, чтобы сделать ее широко доступной, поскольку она, по-видимому, является более или менее глобальной функцией. Спасибо – mils

+0

Я рад, что это помогло. Я бы просто поместил его в файл app/helpers.php. Если вы согласны с этим подходом, не забудьте автозагрузить его, добавив '' файлы: ["app/helpers.php"] 'в раздел' autoload' вашего 'composer.json'. – peterm