【问题标题】:Grails and Tomcat: Where to store uploaded files in filesystem?Grails 和 Tomcat:在文件系统中存储上传文件的位置?
【发布时间】:2011-06-24 03:58:06
【问题描述】:

我使用 Grails 编写了一个小型 Web 应用程序。生成的 war 文件部署在 Tomcat 应用服务器上。

该应用具有附件上传功能。我选择将上传的文件保存到磁盘(而不是将 blob 存储在数据库中)。

起初我在 webapp-dir 中选择了一个文件路径来存储文件,但后来我意识到每次部署新的 war 文件都会覆盖这个目录。

对于“在本地文件系统中的何处存储上传的文件”,是否有最佳实践

感谢您的帮助。

【问题讨论】:

  • 如果您阅读 Grails 邮件列表,您会发现我有完全相同的问题。希望得到一个好的答案。
  • 如果您从邮件列表中获得有用的信息,请您在此处发布解决方案吗?

标签: tomcat grails file upload storage


【解决方案1】:

AlphaOne,我们做的事情与您的要求类似,但我们在 Tomcat 前使用 Apache 网络服务器。我们从配置文件中获取完整路径并写入它。说“/tmp/branding”。然后我们还从配置文件(比如“myapp/branding”)中获取该位置的 url 路径,并在我们的 GSP 中使用它。然后,在 Apache 中,我们将针对该 url(“myapp/branding”)的应用程序请求映射到直接转到文件位置,绕过 Tomcat。

【讨论】:

  • 警告,很多操作系统偶尔会清除tmp目录。如果经过了一定天数,通常在启动时完成。它可能看起来不可预测,并且可能难以调试。
【解决方案2】:

为上传创建一个单独的项目并传递用户名以创建用户特定的文件夹。当用户想要上传文件时,提供从主项目到该项目的链接。

【讨论】:

    【解决方案3】:

    我建议使用环境变量来存储位置,或者更好地使用环境变量来设置配置属性文件的位置并在那里设置属性。这样,操作团队就可以配置位置,他们应该管理文件系统/配置问题。

    【讨论】:

    • 听起来很有趣,但是:运营团队只能将目录配置为应用程序服务器可以处理的路径。如果文件将存储在假设“/tmp/”中,则应用服务器将无法将此图像发送到浏览器。那么满足这两个要求的好位置在哪里:应用服务器可以将文件发送到浏览器并且目录不会在部署时被覆盖?
    • 他们还应该控制 appserver/webserver 的配置。如果您还需要返回内容,请使用另一个配置参数作为所服务目录的 url 位置。
    【解决方案4】:

    我猜您正在寻找最佳实践解决方案。嗯,实际上并没有,但有些地方应该避免放置它们。我假设是 UNIX 环境。

    例如:

    • $CATALINA_HOME。保留应用程序文件夹的原样,不要被上传的文件污染。
    • /tmp 。你永远不知道谁会清理这个。

    虽然我不确定这是一个锁定的规范,但您可以查看:linux directory structure

    按照我的阅读方式,您有 3 个选项:

    1. 如果 Tomcat 使用专用用户运行 -> 用户主目录。例如 ~/Fileuploads/appname
    2. 因为 var 可以被看作是一个不断增长的应用程序数据目录。例如:/var/Fileuploads/appname
    3. 留给系统管理员。看看这个:Externalizing Grails Configuration

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2014-06-22
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多