簡體   English   中英

Java-Java Web應用程序中文件的相對路徑

[英]Java - Relative path of a file in a java web application

我想從Java Web應用程序讀取文件。 我不想提供文件的絕對路徑。 我只想將文件放在Web應用程序的某個目錄中。

要么

可以將其與.war文件(打包的Web應用程序)一起放置。

給文件的相對路徑。 我嘗試了./filename.csv但是沒有用。

========

更新

========

我將向客戶提供WAR文件(打包的Web應用程序)。 該Web應用程序將讀取一個文件(讓我們說SuppliedFile.csv ),該文件將由客戶端復制到服務器。 因此,我需要一種機制(無論應用程序服務器是否打開WAR都不會起作用),以便Web應用程序可以讀取該文件。

注意:我沒有在servlet中使用SuppliedFile.csv ...我正在純Java類中使用它...

您真的需要從文件中加載它嗎? 如果將其放在您的類中(在WEB-INF / classes中),則可以使用類加載器獲取InputStream:

InputStream csv = 
   SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");

您也許可以簡單地訪問系統上預先安排的文件路徑。 這是可取的,因為根據系統配置,添加到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>

然后檢索此路徑並將其用作讀取客戶端提供的文件的基本路徑。

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;
        // ...
    }
}

正如我提到的那樣,您遇到的最可能的問題是安全性限制。 不能保證webapp可以准備高於其webapp根目錄的任何文件。 但是通常有簡單的方法可以為特定Web應用程序的特定路徑授予例外。

不管您隨后需要使用哪個代碼訪問該文件,由於您正在Web應用程序中運行,因此可以確保首先對其進行初始化,並且可以將其值保存在便於其余代碼引用的位置,例如在我的文章中。示例或更好的示例,只需將路徑作為參數傳遞給需要它的代碼即可。

如果您在Web服務器中具有該文件的路徑,則可以使用ServletContext.getRealPath()獲得服務器文件系統中的真實路徑。 請注意,並不能保證在每個容器中都能正常工作(因為不需要容器即可解壓縮WAR文件並將其內容存儲在文件系統中-盡管大多數情況如此)。 而且我猜想它不能用於/ WEB-INF中的文件,因為它們沒有虛擬路徑。

另一種方法是使用ServletContext.getResource()返回URI。 該URI可能是“文件:” URL,但對此不做任何保證。

許多流行的Java Web應用程序(包括JenkinsNexus )都使用此機制:

  1. (可選) 檢查servlet context-param / init-param 這允許使用context.xml每個servlet容器中配置多個webapp實例,這可以通過修改WAR或更改服務器設置來完成(對於Tomcat)。

  2. 檢查環境變量 (使用System.getenv )(如果已設置),然后將該文件夾用作應用程序數據文件夾。 例如,詹金斯使用JENKINS_HOME而Nexus使用PLEXUS_NEXUS_WORK 這允許靈活配置,而無需更改WAR。

  3. 否則,請使用用戶主文件夾內的子文件夾 ,例如$HOME/.yourapp 在Java代碼中,這將是:

     final File appFolder = new File(System.getProperty("user.home"), ".yourapp"); 

另一種方法是使用ServletContext.getResource()返回URI。 該URI可能是“文件:” URL,但對此不做任何保證。

您不需要將其作為文件:... URL。 您只需要將其作為JVM可以讀取的URL,便可以了。

如果您正在使用類似Tomcat的容器,則還有另一種方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM