【问题标题】:How to create a folder in the same directory as the web application?如何在与 Web 应用程序相同的目录中创建文件夹?
【发布时间】:2013-10-22 05:20:57
【问题描述】:

假设我的 Web 应用程序在 Eclipse 中处于开发阶段,位于路径 C:\eclipse\workspace\myapp (Windows)。

我打算让它在同一目录级别(C:\eclipse\workspace\myappfiles)生成一个文件夹来存储上传的文件(通过new File())。

但是,在生产阶段,我的 Web 应用程序将位于路径 /var/lib/tomcat7/webapps/myapp (Linux)。然后它应该将文件存储在/var/lib/tomcat7/webapps/myappfiles

如何检测这些路径来写入文件夹和文件?

我尝试了一些java.io.File 方法,但似乎没有适合我完成任务的默认方法。

编辑:

我需要这样的路径,这样我就可以映射路径以通过 URL 直接访问文件。

【问题讨论】:

  • 只是一个评论,这在实践中是一个非常糟糕的主意,你希望将文件存储在某种文件系统中,比如Amazon S3

标签: java eclipse file tomcat path


【解决方案1】:

它应该完成工作:

File currentDirectory = new File("");
String commonPath = currentDirectory.getAbsolutePath();
commonPath = commonPath.substring(path.lastIndexOf(File.separator) + 1);
File myFilesDir = new File(commonPath + "myappfiles");
myFilesDir.mkdirs();

【讨论】:

    【解决方案2】:

    没有从 Tomcat 本身获取 Tomcat 路径的标准方法。您可以尝试查找 Tomcat 用户的工作目录,但这可能会根据您启动服务器的位置而改变。最安全的方法是将您的应用程序创建的任何文件的位置添加到您的配置中,然后让您的 web 应用程序检查该位置的配置。

    一种简单且可移植的方法是将myappfiles 的位置放在您的web.xml 中:

    <servlet>
      <servlet-name>MyServlet</servlet-name>
      <servlet-class>com.example.mycompany.MyServlet</servlet-class>
      <init-param>
        <param-name>appfilesdir</param-name>
        <param-value>/var/lib/tomcat7/webapps/myappfiles</param-value>
      </init-param>
    </servlet>
    

    然后使用 Servlet 中的 GenericServlet.getInitParameter 读取并使用它:

    public class MyServlet extends HttpServlet
    {
        private String myAppFilesDir;
    
        public void init(ServletConfig config)
          throws ServletException
        {
           myAppFilesDir = getInitParameter("appfilesdir");
        }
    
    }
    

    【讨论】:

    • 明白,而且是一个很好的做法。在这种情况下,您并没有真正硬编码您的应用程序在哪里,而是您的应用程序工作文件在哪里。如 cmets 中所示,将这两者分开是一种很好的方法,因为这允许您升级 servlet 容器而不会影响应用程序所需的文件。但是,如果您想始终如一地定义您的应用程序在哪里,您应该使用@KayKay 的解决方案,确保始终定义 CATALINA_HOME,或者使用您自己的环境变量以避免在同一台机器上部署多个 tomcat 的情况下出现问题。跨度>
    【解决方案3】:

    正如 david99world 在他的评论中所说:这是一个非常糟糕的主意。另外,它甚至可能不适用于未来版本的 tomcat 或不同的配置:可以将 Tomcat 设置为根本没有“爆炸”的 web 应用程序——例如从压缩的*.war 文件运行。此外,tomcat 可能没有对其自己的 webapps 目录的写入权限(为强化系统而采取的基本预防措施)。

    假设有人正在上传一个名为“explorer.jsp”的文件,其中包含在 jsp 中实现的基本文件资源管理器:如果不考虑它,tomcat 会很乐意将其解释为需要在服务器端执行的代码。

    你想做的是:

    • 在某个地方找到一个上传目录,并将您的文件存储在那里。
    • 编写一个从该位置提供文件的下载 servlet。

    您将需要一点更多的工作,但结果安装是开箱即用的安全得多。

    【讨论】:

    • 这是@david99world 的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多