Как получить путь к файлу с помощью 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') }}" />
но путь, или что-нибудь способен получить полный путь не доступен (насколько я вижу). Так как я могу вернуть полный путь? Или мне интересно, если это по дизайну? Если да, то почему я не должен быть в состоянии получить полный путь? Или я иду по этому совершенно неправильному пути?
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