【问题标题】:Grails: Serving Static Content from outside the applicationGrails:从应用程序外部提供静态内容
【发布时间】:2012-10-19 20:01:39
【问题描述】:

我正在开发一个 CMS,我希望用户能够上传他们自己的图片、CSS 文件等。为了资源的安全,我不想将上传的文件存储在应用程序结构/部署的 WAR 中。

从非 grails 位置的控制器提供 grails 内容的最简单方法是什么?

【问题讨论】:

  • 为什么不使用前端来提供静态内容?比如像 Nginx
  • 不确定我是否理解您的问题,但是......它很容易编写一个控制器方法,从文件系统上的某个位置读取图像(或任何其他静态内容),然后将其发送到浏览器.有点像代理,但从文件系统转发。

标签: image grails upload static


【解决方案1】:

通过适当的工具提供静态内容是正确的方式,所有的网络服务器都提供了实现这一点的可能性。如果您想在 Grails 应用程序中实现对这些内容的管理,请在 Config.groovy 中配置静态内容的目的地,仅此而已。

不要通过控制器实现从文件系统加载内容,你是在重新发明轮子;-) 而且 Web 服务器的性能要高得多;-)

【讨论】:

    【解决方案2】:

    经过大量研究和质疑,我决定将静态资源(如图片)打包到数据库中。这样做的好处是:

    1. 您无需将图像打包到应用程序中(重新部署可能会导致您丢失所有图像)
    2. 您无需将图像存储在服务器上的其他位置,远离您的应用程序。
    3. 您无需使用第三方服务,例如 Amazon S3。
    4. 编写一个简单的控制器来提供数据库中的文件相对简单。

    缺点是:

    1. 您无法访问/操作文件系统上的文件。
    2. 数据库会增长并且可能变得非常缓慢。
    3. 每次有人请求图像时,您都需要调用数据库。

    我决定采用该解决方案,尽管存在这些缺点。我是这样对待他们的:

    1. 这不是问题,因为它是 100% 在线系统。
    2. 我的图片很小,而且数量不多,所以这不是问题。
    3. 利用了高效且简单的缓存机制。见下文:

    我通过使用 etags (documentation) 和使用 EHCache (documentation) 来缓存图像服务器端来使用智能浏览器缓存。上传新图片后,电子标签会立即更改,缓存会被清除,从而迫使浏览器下载新的副本。

    到目前为止,MySQL 数据库的性能损失并不明显,而且性能快如闪电。

    【讨论】:

      【解决方案3】:

      我将添加一个指向远程文件系统文件夹的上下文别名,正如 cdavis226 在他的帖子中所解释的那样:

      http://web.archive.org/web/20190906142211/http://grails.1312388.n4.nabble.com/How-to-configure-context-xml-aliases-for-Tomcat-7-td4632149.html

      如果您使用的是 Grails 默认 Tomcat 服务器,则此解决方案有效。

      【讨论】:

      • 有没有办法以编程方式进行设置?
      猜你喜欢
      • 1970-01-01
      • 2015-05-24
      • 2018-09-28
      • 1970-01-01
      • 2016-05-02
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多