UrlMappings 将 URL 指向 Grails 中的资产管道文件
Posted
技术标签:
【中文标题】UrlMappings 将 URL 指向 Grails 中的资产管道文件【英文标题】:UrlMappings to point a URL to an asset pipeline file in Grails 【发布时间】:2015-10-05 03:46:27 【问题描述】:在 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 服务器错误。
【问题讨论】:
【参考方案1】:如果您不使用 Asset-Pipeline,您可以按照 Grails Documentation 中列出的步骤将静态资源映射到 URL。但是,您的问题是询问如何使用 Asset-Pipeline plugin 将单个资源映射到单个 URL。
Burt Beckwith 几年前就 Grails forum 提供了关于 Grail 在提供静态资源方面的作用的见解。
Grails 不提供静态资源,容器提供。因此,无法直接配置映射 - 您需要通过控制器提供服务或按照 Eric 的建议配置代理。
伯特
这个答案可能不令人满意。但是,如果您必须提供静态资源并且绝对不想使用控制器或代理,您可以尝试以下方法。
创建一个名为 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。
【讨论】:
这个解决方案真的有效吗?它看起来与原始问题中的"/t3.png" (uri: "/images/test.png")
非常相似,这对我不起作用。请注意,问题是关于将 URL(singular)映射到文件(singular)。
我确认它有效。尝试映射到资产文件夹之外的文件。将它放在 grails 项目目录中,看看是否可以将 URL 映射到它。
您使用的网址是什么? (注意:映射到assets
文件夹之外的文件没有任何价值,因为您甚至不需要映射。)
在 GSP 中使用 <asset:image src="t1.png"/>
的更新答案具有显示图像的效果,但看起来 HTTP 响应在技术上是 html (Content-Type:text/html;charset=UTF-8
)。此解决方案可能适用于某些用例,但不适用于需要图像文件本身的情况。【参考方案2】:
我认为您需要将 URL 映射到 Asset Plugin 的 AssetController,如下所示(未测试):
class UrlMappings
static mappings =
...
"/files/$id" (controller :"AssetController", action:"index")
...
HTH
【讨论】:
这是一种有趣的方法,但它似乎只会导致 404(我还使用AssetController
尝试了各种其他排列,但没有成功)。您有具体的工作示例吗?
其实不是,这只是一个想法。我对AssetController
进行了简短的了解,这是一个可行的想法……也许看看AssetTagLib
可以帮助您理解AssetPlugin
,并且您可以编写自己的控制器来实现您想要的东西。跨度>
【参考方案3】:
使用"/favicon.ico"(uri: "/assets/favicon.ico")
对我有用。
从概念上讲,Asset Pipeline 似乎将资产扁平化(因此您无需为 uri
指定 images
、javascripts
、stylesheets
)
Grails:3.2.11
资产管道:2.14.6
【讨论】:
以上是关于UrlMappings 将 URL 指向 Grails 中的资产管道文件的主要内容,如果未能解决你的问题,请参考以下文章