Я экспериментировал с использованием новой интеграции 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') }}" />
но путь или что-либо, способное извлечь полный путь, недоступен (насколько я вижу). Так как я могу вернуть полный путь? Или мне интересно, если это по замыслу? Если так, почему я не должен быть в состоянии получить полный путь? Или я иду по этому пути совершенно неправильно?
Изменить: решение для 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";
Этот метод существует начиная с 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'),
В приложении / Провайдеры / 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 / link, затем путь, как показано ниже:
$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',
]);
контроллер:
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('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();