【问题标题】:UrlMappings to point a URL to an asset pipeline file in GrailsUrlMappings 将 URL 指向 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 服务器错误。

【问题讨论】:

    标签: grails asset-pipeline url-mapping grails-3.0 urlmappings.groovy


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多