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

Yat*_*oel 32 java web-applications

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

要么

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

给文件的相对路径是什么.我试过./filename.csv但它没用.

========

更新

========

我将向WAR我的客户端提供一个文件(打包的Web应用程序).此Web应用程序将读取一个文件(假设SuppliedFile.csv),该文件将由客户端复制到服务器.所以我需要一种机制(无论应用程序服务器是否会打开它都能工作WAR),以便Web应用程序可以读取该文件.

注意: 我没有SuppliedFile.csv在servlet中使用...我在普通的Java类中使用它...

Thi*_*ilo 28

你真的需要从文件中加载它吗?如果将它放在类中(在WEB-INF/classes中),可以使用类加载器为它获取一个InputStream:

InputStream csv = 
   SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");
Run Code Online (Sandbox Code Playgroud)

  • 这取决于您无法控制的"当前工作目录".即便如此,除非已经解压缩webapp,否则它将无法工作. (2认同)

Mar*_*ouf 14

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

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

您可以轻松地从servlet配置中检索路径:

<web-app>
<context-param>
    <param-name>MyAppHome</param-name>
    <param-value>/usr/share/myapp</param-value>
</context-param>
...
</web-app>
Run Code Online (Sandbox Code Playgroud)

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

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;
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

无论您需要访问此文件的代码如何,因为您在Web应用程序中运行,所以您可以保证首先对其进行初始化,并且可以将其值存储在方便其他代码引用的位置,如在我的例如或更好,只需将路径作为参数传递给需要它的代码.


Tim*_*sen 9

如果Web服务器中有该文件的路径,则可以使用ServletContext.getRealPath()获取服务器文件系统中的实际路径.请注意,不保证在每个容器中都可以工作(因为不需要容器来解压缩WAR文件并将内容存储在文件系统中 - 尽管如此).我想它不适用于/ WEB-INF中的文件,因为它们没有虚拟路径.

另一种方法是使用返回URI的ServletContext.getResource().此URI可能是"file:"URL,但不保证这一点.