2011-09-01 41 views
5

我有一個上傳表單的用戶可以上傳文件的Web應用程序。Java EE - 獲取上傳文件真實路徑的最佳方法?

我想將文件存儲到文件夾'文件'。我想這個文件夾直接放在webapp-root下。

使用Struts2的,在我的uploadFileAction,我可以輕鬆地設置這條道路與String uploadDir = ServletActionContext.getServletContext().getRealPath("/files")+ "/";

但是,當我試圖恢復的文件,顯然我的豆它試圖文件無法訪問接入getServletContext()和從而拋出一個空指針getRealPath

現在即時嘗試弄清楚我應該如何處理這個問題。我聽說過春季資源是要走的路,但我找不到任何相關的例子。

有沒有簡單的方法來獲得我的路徑?我只想將rootpath指向我的webapp。沒有什麼比這更少的了......

回答

8

我想將此文件夾直接放置在webapp-root下。

這是行不通的。所有這些文件在重新部署Web應用程序或重新啓動服務器時都會丟失。這些文件即不包含在原始WAR中。

您需要將它們存儲在webapp上下文之外的固定路徑中。例如。 /var/webapp/uploads。您可以在屬性文件或系統屬性中配置此路徑。

+0

哇。我沒有想到這一點。感謝您指出我的明顯錯誤。但是當我在平臺之間移動時(linux-windows),我需要一個相對路徑到我的上傳目錄。我不想在每次創建平臺時都跳轉到屬性文件... – user829237

+1

在Java文件API中,像'/ var/webapp/uploads'這樣的類似Unix的路徑在Windows中工作得很好。它只是相對於執行代碼的磁盤而言的,Java會關注斜槓。例如。當服務器運行在'C:'上時,它最終會變成'C:\ var \ webapp \ uploads'。 – BalusC

+0

謝謝你清除那一點。原諒我是一個unix新手,但我仍然有點不確定如何指定路徑,因爲我的UNIX服務器是共享主機,我想我只能訪問〜目錄,我需要把文件下的某個地方..任何指針會有很大的幫助! – user829237

3

我發現有幾種方法可以實現這一點,無論您使用的是哪種操作系統平臺。我通常喜歡以相對於我的Web應用程序的某種方式存儲我的文件。這就是說,最簡單的方法是使用你的類文件作爲參考來獲得真正的路徑。我用類似下面的存儲圖片上傳了,我已經建立了幾個Web應用程序:

public class FileLocationTest { 

    public static void main(String[] args) { 
     String path = FileLocationTest.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     System.out.println(path); 
    } 
} 

你可以在你的web應用程序使用靜態實用類來完成,或與此有關的任何類無論操作系統如何,都可以獲得應用程序的真實路徑或者在一個servlet中,我也使用請求類來獲取Tomcat位置,如果我的appbase位於不同的區域,如下所示:

String location = request.getClass().getProtectionDomain().getClassLoader().getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 
    String path = location.substring(0, location.indexOf("/tomcat")) + "/data/events/images/";