代码之家  ›  专栏  ›  技术社区  ›  Amit

Java——Web应用程序中文件的相对路径

  •  32
  • Amit  · 技术社区  · 15 年前

    我想从Java Web应用程序中读取一个文件。我不想给出文件的绝对路径。我只想把文件放在我的Web应用程序的某个目录中。

    它可以与.war文件(打包的Web应用程序)一起放置。

    为文件指定的相对路径。我试过 ./filename.csv 但它不起作用。

    不受欢迎的=

    更新的

    不受欢迎的=

    我会送一个 WAR 文件(打包的Web应用程序)到我的客户端。此Web应用程序将读取一个文件(例如 SuppliedFile.csv )它将被客户机复制到服务器。因此,我需要一种机制(不管应用服务器是否会取消锁定 战争 否则,Web应用程序就可以读取该文件。

    注: 我没有用 提供文件.csv 在servlet中…我在一个普通的Java类中使用它…

    6 回复  |  直到 11 年前
        1
  •  28
  •   Thilo    15 年前

    您真的需要从文件中加载它吗?如果将它与类(在WEB-INF/类中)放在一起,则可以使用类加载器获取其输入流:

    InputStream csv = 
       SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");
    
        2
  •  14
  •   itsadok    15 年前

    您可以简单地访问系统上预先安排的文件路径。最好这样做,因为添加到webapp目录的文件可能丢失,或者webapp可能无法解压缩,具体取决于系统配置。

    在我们的服务器中,我们在应用服务器的JVM中定义了一个系统属性集,该属性集指向应用程序外部数据的“主目录”。当然,这需要修改应用服务器的配置(-dapp_home=..在启动时添加到JVM选项中),我们这样做主要是为了简化在应用服务器上下文之外运行的代码的测试。

    您可以很容易地从servlet配置中检索路径:

    <web-app>
    <context-param>
        <param-name>MyAppHome</param-name>
        <param-value>/usr/share/myapp</param-value>
    </context-param>
    ...
    </web-app>
    

    然后检索此路径并将其用作读取客户机提供的文件的基本路径。

    public class MyAppConfig implements ServletContextListener {
    
        // NOTE: static references are not a great idea, shown here for simplicity
        static File appHome;
        static File customerDataFile;
    
        public void contextInitialized(ServletContextEvent e) {
    
            appHome = new File(e.getServletContext().getInitParameter("MyAppHome"));
            File customerDataFile = new File(appHome, "SuppliedFile.csv");
        }
    }
    
    class DataProcessor {
        public void processData() {
            File dataFile = MyAppConfig.customerDataFile;
            // ...
        }
    }
    

    正如我提到的,您将遇到的最可能的问题是安全限制。没有什么能保证webapps可以在其webapp根目录上准备好任何文件。但是,通常有一些简单的方法可以为特定webapps的特定路径授予异常。

    不管您需要访问这个文件的代码是什么,因为您在一个Web应用程序中运行,您可以保证这是首先初始化的,并且可以将它的值存储在方便其他代码引用的地方,就像在我的示例中,或者更好地说,只需将路径作为参数传递给需要它的代码即可。

        3
  •  9
  •   Tim Jansen    15 年前

    如果在Web服务器中有该文件的路径,则可以使用 ServletContext.getRealPath() . 请注意,它并不能保证在每个容器中都能工作(因为不需要容器来解包war文件并将内容存储在文件系统中——大多数情况下都需要这样做)。我想它不能与/WEB-INF中的文件一起工作,因为它们没有虚拟路径。

    另一种选择是使用 ServletContext.getResource() 它返回一个URI。这个URI可能是一个“文件:”URL,但不能保证。

        4
  •  3
  •   Hendy Irawan    11 年前

    许多流行的Java Web应用程序,包括 Jenkins Nexus ,使用此机制:

    1. 可选, 检查servlet上下文参数/init参数 . 这允许为每个servlet容器配置多个webapp实例,使用 context.xml 这可以通过修改war或更改服务器设置(在Tomcat的情况下)来完成。

    2. 检查环境变量 (使用) System.getenv ,如果已设置,则使用该文件夹作为应用程序数据文件夹。例如,詹金斯使用 JENKINS_HOME Nexus使用 PLEXUS_NEXUS_WORK . 这允许灵活配置,而不需要对战争进行任何更改。

    3. 否则, 使用用户主文件夹中的子文件夹 ,例如 $HOME/.yourapp . 在Java代码中,这将是:

      final File appFolder = new File(System.getProperty("user.home"), ".yourapp");
      
        5
  •  1
  •   Daniel    13 年前

    另一种方法是使用servletContext.getResource(),它返回一个URI。这个URI 可能是一个“文件:”URL,但不能保证。

    你不需要它是一个文件:…网址。你只需要它是一个你的JVM可以的URL 读一读——它会的。

        6
  •  -9
  •   carlos    11 年前

    还有另一种方法, 如果您使用像Tomcat这样的容器:

    String textPath = "http://localhost:8080/NameOfWebapp/resources/images/file.txt";