2013-10-14 182 views
0

假設我的Web應用程序在Eclipse的開發階段,路徑爲C:\eclipse\workspace\myapp(Windows)。如何在與Web應用程序相同的目錄中創建文件夾?

我打算讓它在相同的目錄級別生成一個文件夾(C:\eclipse\workspace\myappfiles)以將上傳的文件(通過​​)存儲在其中。

但是,在生產階段,我的web應用程序將位於路徑/var/lib/tomcat7/webapps/myapp(Linux)。然後它應該在/var/lib/tomcat7/webapps/myappfiles中存儲文件。

如何檢測寫入文件夾和文件的路徑?

我嘗試了一些java.io.File方法,但它似乎沒有適合我的任務的默認方法。

編輯:

我需要這樣的路徑,所以我可以爲映射通過URL直接文件訪問的路徑。

+3

只是一個評論,在實踐中這是一個非常糟糕的主意,你會希望將文件存儲在某種文件系統中,比如像[Amazon S3](http://aws.amazon.com/s3/ ) – david99world

回答

0

應該把工作做好:

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

有沒有標準的方式來獲得從Tomcat本身Tomcat的路徑。您可以嘗試查找Tomcat用戶的工作目錄,但這可能會根據您從哪裏啓動服務器而更改。最安全的方法是將應用程序創建的任何文件的位置添加到配置中,然後讓webapp檢查此位置的配置。

一個簡單的方法和便攜的方式做,這是放置在你的web.xml的myappfiles位置:

<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> 

然後從使用GenericServlet.getInitParameter你的servlet中讀取它並使用它:

public class MyServlet extends HttpServlet 
{ 
    private String myAppFilesDir; 

    public void init(ServletConfig config) 
     throws ServletException 
    { 
     myAppFilesDir = getInitParameter("appfilesdir"); 
    } 

} 
+0

瞭解,並且是一個很好的做法。在這種情況下,你並不是真正在你的應用程序的硬編碼,而是你的應用程序工作文件的位置。如註釋所示,將這兩者分開是一種很好的方法,因爲這樣可以升級servlet容器,而不會影響應用程序需要的文件。但是,如果您想要一致地定義應用程序的位置,則應該使用@ KayKay的解決方案,確保始終定義CATALINA_HOME,或者使用您自己的環境變量來避免在同一臺計算機上部署多個tomcat的情況下出現問題。 – lreeder

0

正如david99world說,在他的評論:這是一個非常糟糕的主意。另外,它甚至可能不適用於未來版本的tomcat或不同的配置:Tomcat可以設置爲根本不具有「爆炸」的web應用 - 例如從壓縮的*.war文件運行。此外,tomcat可能沒有對自己的webapps目錄的寫入權限(這是加強系統的基本預防措施)。

想象一下,有人正在用jsp中實現的基本文件瀏覽器上傳名爲「explorer.jsp」的文件:如果不考慮它,tomcat會很樂意將此解釋爲需要在服務器端執行的代碼。

你想要做的是:

  • 查找上傳目錄,某個地方,以及存儲文件存在。
  • 編寫一個下載servlet來提供該位置的文件。

你需要一個一點多做一些工作這種方式,但由此產生的安裝這麼多的安全外的開箱。

+0

這是@ david99world的評論。 – lreeder

+0

感謝 - 更正。我不知道我的眼睛對我做了什麼 –

相關問題