7

В Grails 3.0 как вы сопоставляете URL-адрес файла в папке assets?UrlMappings, чтобы указать URL-адрес файла конвейера активов в Grails

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

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

Grails-приложение/контроллеры/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.

ответ

0

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

class UrlMappings { 
    static mappings = { 

    ... 

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

HTH

+0

Это интересный подход, но, похоже, это только результат 404s (я также пробовал различные другие перестановки с использованием AssetController без успеха). У вас есть конкретный рабочий пример? –

+0

На самом деле нет, это была просто идея. Я коротко рассмотрел «AssetController» мысль, которая могла бы сработать ... Может быть, взгляд в «AssetTagLib» поможет вам понять «AssetPlugin», и вы можете написать собственный контроллер, к которому вы хотите. – YAT

0

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

Burt Beckwith представил информацию о Grails forum несколько лет назад о роли Grail в обслуживании статических ресурсов.

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

Burt

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

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

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

Затем нужно настроить URL отображения, чтобы указать на image.gsp странице.

class UrlMappings { 

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

} 

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

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

+0

Действительно ли это решение работает? Он выглядит очень похоже на '' /t3.png (uri: "/images/test.png") 'из исходного вопроса, и это не работает для меня. Обратите внимание, что вопрос заключается в отображении URL (** сингулярного **) в файл (** сингулярный **). –

+0

Я проверил, что он сработал. Попробуйте сопоставить файл за пределами папки с ресурсами. Поместите его в каталог проекта grails и посмотрите, можете ли вы сопоставить URL-адрес с ним. – Nathan

+0

Какой URL-адрес вы использовали? (обратите внимание: сопоставление файла за пределами папки 'assets' не имеет значения, так как вам даже не нужно сопоставление.) –

0

Вот что я имел обыкновение обслуживать swfobject.js в определенном URI:

Добавить отображение URL:

"/swf/swfobject.js" (controller:"facerecorder", action:"swfobject") 

Добавить действие в контроллер, который определяет местоположение ресурса и служит его. Обратите внимание, что assetResourceLocator, являющийся частью конвейера активов, вводится в контроллер.

class FacerecorderController { 

    def assetResourceLocator 

    def swfobject() { 
     def resource = assetResourceLocator.findAssetForURI('swf/swfobject.js') 
     render file: resource.inputStream, contentType: 'text/javascript' 
    } 
} 

Это определенно не идеальный вариант, но он работает. Протестировано с использованием Grails 3.0.17