UrlMappings для указания URL-адреса на файл конвейера ресурсов в Grails.

Как в Grails 3.0 сопоставить URL-адрес с файлом в папке assets?

Например:
http://localhost:8080/favicon.ico --> grails-app/assets/images/bookmark.ico

Я пробовал несколько тестовых сопоставлений, таких как:

grails-app/controllers/UrlMappings.groovy

class UrlMappings {

   static mappings = {
      ...
      "/t1.png"  (uri: "/assets/images/test.png")
      "/t2.png"  (uri: "/assets/test.png")
      "/t3.png"  (uri: "/images/test.png")
      "/t4.png"  (dir: "assets/images", file: "test.png")
      ...
      }

}

... но все они приводят к ошибке сервера 500.


person Dem Pilafian    schedule 15.07.2015    source источник


Ответы (3)


Если вы не используете Asset-Pipeline, вы можете сопоставить статические ресурсы с URL-адресами, выполнив шаги, описанные в Документация по Grails. Однако ваш вопрос заключается в том, как сопоставить один ресурс с одним URL-адресом с помощью плагина Asset-Pipeline.

Берт Беквит рассказал о форуме Grails. несколько лет назад о роли Grail в обслуживании статических ресурсов.

Grails обслуживает не статические ресурсы, а контейнер. Таким образом, нет возможности напрямую настроить отображение — вам нужно обслуживать его через контроллер или настроить прокси, как предлагает Эрик.

Берт

Этот ответ может быть неудовлетворительным. Но если вы должны обслуживать статический ресурс и совершенно не хотите использовать контроллер или прокси, вы можете попробовать следующее.

Создайте представление с именем image.gsp. Представление будет содержать только тег актива. Используя ваши примеры выше,

<asset:image src="t1.png"/>

Затем настройте сопоставления URL-адресов, чтобы они указывали на страницу image.gsp.

class UrlMappings {

   static mappings = {
      ...
      "/t1.png"  (view: "image")
      ...
      }

}

Я понимаю, что это может быть не тот метод, который вы надеялись использовать. Но я думаю, что понимание того, какую роль играет Grails по сравнению с контейнером, на котором работает Grails, поможет принять решение о правильном обслуживании ресурса пользователем.

Я знаю, что это может показаться несвязанным, но если вы хотите создать страницу со списком содержимого каталога, проверьте это сообщение от CodePanda. Его код можно использовать в качестве шаблона для создания контроллера для обслуживания одного файла, и он объясняет, как обновить представление, контроллер и groovy.config.

person Nathan    schedule 27.07.2015
comment
Действительно ли это решение работает? Это очень похоже на "/t3.png" (uri: "/images/test.png") из исходного вопроса, и это не работает для меня. Обратите внимание, что вопрос касается сопоставления URL-адреса (единственного числа) с файлом (единственного числа). - person Dem Pilafian; 28.07.2015
comment
Я убедился, что это сработало. Попробуйте сопоставить файл за пределами папки с активами. Поместите его в каталог проекта Grails и посмотрите, сможете ли вы сопоставить с ним URL-адрес. - person Nathan; 28.07.2015
comment
Какой URL вы использовали? (примечание: сопоставление с файлом за пределами папки assets не имеет значения, поскольку тогда вам даже не нужно сопоставление.) - person Dem Pilafian; 28.07.2015
comment
Обновленный ответ на использование <asset:image src="t1.png"/> внутри GSP приводит к отображению изображения, но похоже, что HTTP-ответ технически представляет собой HTML (Content-Type:text/html;charset=UTF-8). Это решение может работать для определенных случаев использования, но оно неприменимо там, где требуется сам файл изображения. - person Dem Pilafian; 10.09.2015

Я думаю, вам нужно сопоставить URL-адрес с AssetController плагина Asset, например (не проверено):

class UrlMappings {
    static mappings = {

    ...

    "/files/$id"  (controller :"AssetController", action:"index") 
       ...
    }
}

ХТН

person YAT    schedule 16.07.2015
comment
Это интересный подход, но, похоже, он приводит только к 404 (я также пробовал различные другие перестановки, используя AssetController, но безуспешно). У вас есть конкретный рабочий пример? - person Dem Pilafian; 17.07.2015
comment
На самом деле нет, это была просто идея. Я бегло взглянул на AssetController и подумал, что это может сработать... Может быть, взгляд на AssetTagLib поможет вам понять AssetPlugin, и вы сможете написать свой собственный контроллер, который будет делать то, что вы хотите. - person YAT; 17.07.2015

Использование "/favicon.ico"(uri: "/assets/favicon.ico") работает для меня.

Концептуально кажется, что Asset Pipeline сглаживает активы (так что вам не нужно указывать images, javascripts, stylesheets для uri)

Grails: 3.2.11 AssetPipeline: 2.14.6

person TolkienWASP    schedule 22.05.2018