#laravel #laravel-8 #laravel-storage
#laravel #laravel-8 #laravel-хранилище
Вопрос:
В моей платформе есть функция, позволяющая пользователям загружать свои собственные изображения значков. После их загрузки я сохраняю их, используя $request-> icon-> store(‘public / icons’) и просто сохраняю возвращенный путь, что-то вроде «public / icons/xa6y2am3e4codqqulpvehfsxdkwfmdogggs 2i67l.png».
Я не совсем понимаю, как правильно отображать значки. URL-адрес для отображения значка в приведенном выше примере — «/ storage/ icons/xa6y2am3e4codqqulpvehfsxdkwfmdogggs 2i67l.png», поэтому мне нужно заменить «public» в пути на «storage», что заставляет меня думать, что я где-то что-то сделал не так (я не вижу причин, по которым метод store () долженукажите мне неверный путь).
Я сделал свои символические ссылки, как описано в документации. Использование локального хранилища. Чего мне не хватает?
Ответ №1:
Вот как я обрабатываю свое хранилище в одном из своих приложений, которое включает блоги:
$storedImageName = $request->file('main_image')->store('blog_images', 'public');
Метод store фактически возвращает сохраненное имя файла вместе с путем. Здесь я указываю, что мой диск public
и папка внутри public
blog_images
. Я сохраняю результат этого в $storedImageName
.
Теперь, чтобы сохранить его в базе данных, я фактически не сохраняю весь путь, я сохраняю ТОЛЬКО имя изображения. Это связано с тем, что в будущем вы можете захотеть обновить имя своего каталога или переместить его в другое место и т. Д. Вы можете получить это следующим образом:
$onlyImageName = basename($storedImageName);
basename() — это функция PHP, не имеющая ничего общего с Laravel.
Таким образом, я могу отображать свои изображения в своих блейд-файлах следующим образом:
<img ... src="{{ asset('/storage/blog_images/' . $blog->main_image) }}" />
asset()
помощник предоставит вам путь к вашему общедоступному каталогу, а затем вам просто нужно указать оставшуюся часть пути к вашему изображению.
Комментарии:
1. Похоже, я в конечном итоге тоже сделаю что-то подобное (сохраняя только часть базового имени, возвращенную из метода store()). Просто не вижу смысла в том, что функция store() возвращает путь, который на самом деле непригоден для использования. Вещи в Laravel обычно являются своего рода волшебством из коробки, поэтому, когда вам нужно ходить по кругу, это обычно признак того, что вы делаете что-то в корне неправильное 🙂
2. Проще вернуть весь путь и извлечь имя, если вам это нужно, вместо того, чтобы возвращать только имя и вручную определять путь, это имеет смысл для меня. Пожалуйста, проголосуйте и примите ответ, если это помогло вам, чтобы другие тоже могли знать. Спасибо!