Как получить путь к файлу с помощью фасада хранилища в 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') }}" />

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

Author: Rishabh, 2015-03-10

11 answers

Редактировать: Решение для L5.2+

Есть лучшее и более простое решение.

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

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

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

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

 33
Author: pj.martorell, 2016-08-25 12:11:41

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

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

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

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

$storagePath."/myImg.jpg";
 112
Author: shock_gone_wild, 2015-03-11 20:40:09

Я не знаю, когда будет добавлен этот метод (я пробовал на laravel 5.6), но вы можете получить его с помощью:

$path = Storage::disk('public')->path($filename);
 10
Author: Bilal Gultekin, 2018-03-28 10:36:53

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

В .env:

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID

В config/filesystems.php :

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

В приложении/Поставщиках/поставщике услуг приложений:

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('/');
}
 8
Author: daviestar, 2016-02-12 15:35:11

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

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

Таким образом, у вас есть полный доступ к функциям, которые вам нужны, например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

 3
Author: manix, 2017-05-23 12:10:26

Сначала получите URL/ссылку на файл, а затем путь, как показано ниже:

$url = Storage::disk('public')->url($filename);
$path = public_path($url);
 3
Author: muzk6, 2016-07-26 06:57:38

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

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"/>
 2
Author: MevlütÖzdemir, 2016-10-10 17:57:20

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

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

 1
Author: nXu, 2017-05-23 12:03:02

В моем случае я сделал отдельный метод для локальных файлов в этом файле: 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 Может быть, кто-то сольет этот))

 1
Author: Ruslan Terekhov, 2016-05-18 16:18:51

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

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

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

$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();
 1
Author: fsasvari, 2017-08-02 13:28:46

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

$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
 1
Author: Arvind Bhardwaj, 2017-09-26 10:03:08