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


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

827   11  

11 ответов:

Edit: решение для 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 не упоминается этот метод, но если вы хотите узнать больше об этом, вы можете проверить его исходный код здесь.

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

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

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

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

$storagePath."/myImg.jpg";

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

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

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

In .env:

APP_FILESYSTEM=local or s3
S3_BUCKET=BucketID

в config/файловые системы.php:

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

в app / Providers / 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('/');
}

ну, несколько недель назад я сделал очень похожий вопрос (получить CDN url из загруженного файла через хранилище): Я хотел, чтобы 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-адрес файла / ссылку, а затем путь, как показано ниже:

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

взгляните на это: как использовать 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');
    }
}

затем я создаю запрос pull к фреймворку, но он все еще не слился с основным ядром: 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, так что вы можете использовать все эти поля на красноречивых полях модели:

$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

Comments

    Ничего не найдено.