Получение правильного URL для загруженных файлов

#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. Проще вернуть весь путь и извлечь имя, если вам это нужно, вместо того, чтобы возвращать только имя и вручную определять путь, это имеет смысл для меня. Пожалуйста, проголосуйте и примите ответ, если это помогло вам, чтобы другие тоже могли знать. Спасибо!