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 中使用 &lt;asset:image src="t1.png"/&gt; 的更新答案具有显示图像的效果,但看起来 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 指定 imagesjavascriptsstylesheets

Grails:3.2.11 资产管道:2.14.6

【讨论】:

以上是关于UrlMappings 将 URL 指向 Grails 中的资产管道文件的主要内容,如果未能解决你的问题,请参考以下文章

Grails 插件如何添加自己的 URLMappings?

攻防世界-reverse-reverse-for-the-holy-grail-350

恢复 Grails url 映射

利用URL重写隐藏复杂的URL

将子域指向 Django 中的特定 url

将subversion工作副本指向移动的存储库URL