Как получить путь к файлу, используя фасад хранилища в 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') }}" />
но путь или все, что можно получить полный путь, недоступно (насколько я вижу). Итак, как я могу вернуть полный путь? Или, мне интересно, если это по дизайну? Если да, то почему я не должен быть в состоянии получить полный путь? Или, я иду об этом совершенно неправильно?
Ответы
Ответ 1
Изменить: решение для 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 не упоминает этот метод, но если вы хотите узнать больше об этом, вы можете проверить его исходный код здесь.
Ответ 2
Путь к вашему диску хранения будет:
$storagePath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix()
Я не знаю более коротких решений для этого...
Вы можете поделиться файлом $storagePath с вашими представлениями, а затем просто вызвать
$storagePath."/myImg.jpg";
Ответ 3
Этот метод существует начиная с Laravel 5.4, вы можете получить его:
$path = Storage::disk('public')->path($filename);
Ответ 4
Вот как я его заработал - переключение между 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('/');
}
Ответ 5
Хорошо, несколько недель назад я задал очень похожий вопрос (Получить CDN-url из загруженного файла через Storage): Я хотел, чтобы 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
Ответ 6
Сначала найдите файл url/link, затем путь, как показано ниже:
$url = Storage::disk('public')->url($filename);
$path = public_path($url);
Ответ 7
Способ сохранения:
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' => '[email protected]',
]);
Контроллер:
public function getImage($filename)
{
$file = Storage::get($filename);
return new Response($file, 200);
}
Вид:
<img src="{{ route('product.image', ['filename' => $yourImageName]) }}" alt="your image"/>
Ответ 8
Если вам нужен абсолютный URL-адрес файла, используйте ниже код:
$file_path = \Storage::url($filename);
$url = asset($file_path);
// Output: http://example.com/storage/filename.jpg
Ответ 9
Взгляните на это: Как использовать storage_path() для просмотра изображения в laravel 4. То же самое относится к Laravel 5:
Хранение - для файловой системы, и большая часть его недоступна для веб-сервера. Рекомендуемое решение - хранить изображения где-то в общей папке (которая является корнем документа), например, в public/screenshots/
.
Затем, когда вы хотите отобразить их, используйте asset('screenshots/1.jpg')
.
Ответ 10
В моем случае я сделал отдельный метод для локальных файлов в этом файле:
SRC/Осветите/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
Может быть кто-то слить этот))
Ответ 11
Если вы просто хотите отобразить путь к хранилищу (диску), используйте это:
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();
Ответ 12
Другое решение, которое я нашел, это:
Storage::disk('documents')->getDriver()->getConfig()->get('url')
Вернет URL с базовым путем хранения документов