Как получить путь к файлу, используя Storage фасад в 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') }}" />

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

57

Решение

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

34

Другие решения

Путь к вашему диску будет:

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

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

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

$storagePath."/myImg.jpg";
126

Этот метод существует начиная с Laravel 5.4, вы можете получить его:

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

Вот как я заставил его работать — переключаясь между 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('/');
}
8

Ну, недели назад я сделал очень похожий вопрос (Получить 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

3

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

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

Магазин метод:

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

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

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();
2
По вопросам рекламы [email protected]