Я экспериментировал с использованием новой интеграции Flysystem с Laravel 5. Я сохраняю «локализованные» пути к БД и заставляю фасад Storage завершить путь. Например, я храню 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";
источник
applyPathPrefix
вот так:Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix('myImg.jpg');
applyPathPrefix
что можно скопировать. Очень странный. (вы можете проверить это, дважды щелкнув имя последнего метода в вашем примере.getDriver()
не нужен. ПростоStorage::disk('local')->getAdapter()->getPathPrefix()
тоже будет работать.Storage::path
, см . Ответ БилалаЭтот метод существует с Laravel 5.4, вы можете получить его:
$path = Storage::disk('public')->path($filename);
источник
Вот как я заставил это работать - переключение между s3 и путями к локальному каталогу с помощью переменной среды, передавая путь всем представлениям.
В .env:
APP_FILESYSTEM=local or s3 S3_BUCKET=BucketID
В config / filesystems.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('/'); }
источник
return Storage::disk('s3')->getDriver()->getAdapter()->getClient()->getObjectUrl(env('S3_BUCKET'), '').'/';
Сначала получите URL-адрес файла / ссылку, затем путь, как показано ниже:
$url = Storage::disk('public')->url($filename); $path = public_path($url);
источник
Если вы просто хотите отобразить путь к хранилищу (диску), используйте это:
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-адрес CDN из загруженного файла через хранилище ): я хотел, чтобы 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-адрес файла, используйте приведенный ниже код:
$file_path = \Storage::url($filename); $url = asset($file_path); // Output: http://example.com/storage/filename.jpg
источник
Способ хранения:
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::disk('documents')->getDriver()->getConfig()->get('url')
Вернет URL с базовым путем к хранилищу документов
источник
Взгляните на это: Как использовать storage_path () для просмотра изображения в laravel 4 . То же самое и с Laravel 5:
Хранилище предназначено для файловой системы, и большая его часть недоступна для веб-сервера. Рекомендуемое решение - хранить изображения где-нибудь в общей папке (которая является корнем документа),
public/screenshots/
например, в. Затем, когда вы хотите их отобразить, используйтеasset('screenshots/1.jpg')
.источник
Storage::path()
возвращает путь к файлу на вашем сервере, но вам нужен URL-адрес, а веб-сервер может обслуживать файлы только из корня вашего документа, то есть<project>/public
. Создайте в нем свои каталоги и используйтеurl()
илиasset()
в шаблонах лезвий.Storage::path()
не существует, я бы хотел, чтобы это былоgetenv('debug')
и решите, какое из них использовать.В моем случае я сделал отдельный метод для локальных файлов в этом файле: 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 Может быть, кто-то объединит это))
источник
эта работа для меня в 2020 году на laravel 7
$image_resize = Image::make($image->getRealPath()); $image_resize->resize(800,600); $image_resize->save(Storage::disk('episodes')->path('') . $imgname);
так что вы можете использовать это так
echo Storage::disk('public')->path('');
источник