Как получить путь к файлу, используя фасад хранилища в laravel 5?

Я экспериментировал с использованием новой интеграции Flysystem с Laravel 5. Я храню «локализованные» пути к БД и получаю фасад хранилища для завершения пути. Например, я храню screenshots/1.jpg и используя

 Storage::disk('local')->get('screenshots/1.jpg') 

или

 Storage::disk('s3')->get('screenshots/1.jpg') 

Я могу получить тот же файл на разных дисках.

get получает содержимое файла, но я надеюсь использовать его в своих представлениях следующим образом:

 <img src="{{ Storage::path('screenshots/1.jpg') }}" /> 

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

Изменить: решение для L5.2 +

Там есть лучшее и более простое решение.

Используйте Storage::url($filename) чтобы получить полный путь / URL данного файла. Обратите внимание, что вам нужно установить S3 качестве файловой системы хранилища в config/filesystems.php : 'default' => 's3'

Конечно, вы также можете сделать Storage::disk('s3')->url($filename) таким же образом.

Как вы можете видеть в config/filesystems.php существует также параметр 'cloud' => 's3' , который относится к файловой системе Cloud. Если вы хотите хранить папку хранилища на локальном сервере, но извлекаете / храните некоторые файлы в облаке, используйте Storage::cloud() , который также имеет те же методы файловой системы, то есть Storage::cloud()->url($filename) .

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

Путь к вашему диску хранения будет:

 $storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix() 

Я не знаю более коротких решений для этого …

Вы можете поделиться файлом $ storagePath с вашими представлениями, а затем просто позвонить

 $storagePath."/myImg.jpg"; 

Вот как я получил его на работу – переключение между s3 и локальными каталогами с переменной окружения, передающей путь ко всем представлениям.

В .env:

 APP_FILESYSTEM=local or s3 S3_BUCKET=BucketID 

В config / filesystems.php:

 'default' => env('APP_FILESYSTEM'), 

В приложении / Провайдерах / AppServiceProvider:

 public function boot() { view()->share('dynamic_storage', $this->storagePath()); } protected function storagePath() { if(Storage::getDefaultDriver() == 's3') { return Storage::getDriver() ->getAdapter() ->getClient() ->getObjectUrl(env('S3_BUCKET'), ''); } return URL::to('/'); } 

Ну, несколько недель назад я задал очень похожий вопрос ( Get CDN url из загруженного файла через Storage ): я хотел, чтобы URL-адрес CDN отображал изображение в моем представлении (по мере необходимости).

Однако после проверки API пакета я подтвердил, что эта задача не существует. Таким образом, мое решение избегало использования flysystem . В моем случае мне нужно было играть с RackSpace. Итак, наконец, решите создать мой пакет использования и создать собственный пакет хранилища, используя PHP SDK для OpenStack .

Таким образом, у вас есть полный доступ к функциям, которые вам нужны, например getPublicUrl() , чтобы получить общедоступный URL-адрес из контейнера cdn:

 /** @var DataObject $file */ $file = \OpenCloud::container('cdn')->getObject('screenshots/1.jpg'); // $url: https://d224d291-8316ade.ssl.cf1.rackcdn.com/screenshots/1.jpg $url = (string) $file->getPublicUrl(UrlType::SSL); 

В заключение, если нужно взять службу хранения на другой уровень, то flysystem недостаточно. В local целях вы можете попробовать решение @ nXu

Сначала получите файл url / link, затем path, как показано ниже:

 $url = Storage::disk('public')->url($filename); $path = public_path($url); 

Способ хранения:

 public function upload($img){ $filename = Carbon::now() . '-' . $img->getClientOriginalName(); return Storage::put($filename, File::get($img)) ? $filename : ''; } 

Маршрут:

  Route::get('image/{filename}', [ 'as' => 'product.image', 'uses' => 'ProductController@getImage', ]); 

контроллер:

  public function getImage($filename) { $file = Storage::get($filename); return new Response($file, 200); } 

Посмотреть:

  <img src="{{ route('product.image', ['filename' => $yourImageName]) }}" alt="your image"/> 

Взгляните на это: Как использовать storage_path () для просмотра изображения в laravel 4 . То же самое относится к Laravel 5:

Хранилище для файловой системы, и большая часть его недоступна для веб-сервера. Рекомендуемое решение – хранить изображения где-нибудь в общей папке (которая является корнем документа), в public/screenshots/ например. Затем, когда вы хотите отобразить их, используйте asset('screenshots/1.jpg') .

В моем случае я сделал отдельный метод для локальных файлов в этом файле: src / Illuminate / Filesystem / FilesystemAdapter.php

  /** * Get the local path for the given filename. * @param $path * @return string */ public function localPath($path) { $adapter = $this->driver->getAdapter(); if ($adapter instanceof LocalAdapter) { return $adapter->getPathPrefix().$path; } else { throw new RuntimeException('This driver does not support retrieving local path'); } } 

то я создаю запрос на растяжение для фреймворка, но он еще не слит в основное ядро: https://github.com/laravel/framework/pull/13605 Может быть, кто-то сменит это))

Если вы просто хотите отобразить путь хранения (диска), используйте это:

 Storage::disk('local')->url('screenshots/1.jpg'); // storage/screenshots/1.jpg Storage::disk('local')->url(''): // storage 

Кроме того, если вам интересно, я создал пакет ( https://github.com/fsasvari/laravel-uploadify ) только для Laravel, поэтому вы можете использовать все эти поля в поля модели Eloquent:

 $car = Car::first(); $car->upload_cover_image->url(); $car->upload_cover_image->name(); $car->upload_cover_image->basename(); $car->upload_cover_image->extension(); $car->upload_cover_image->filesize(); 

Если вам нужен абсолютный URL-адрес файла, используйте код ниже:

 $file_path = \Storage::url($filename); $url = asset($file_path); // Output: http://example.com/storage/filename.jpg