2011-09-27 34 views
3

問題背景:Spring MVC的:FileNotFoundException異常「上傳 MyUploads loading.gif(系統找不到指定的路徑)」

我想堅持一個文件,由用戶上傳,到文件系統。

說明:

其實,我使用Spring MVC(3.0),這就是我正在嘗試堅持文件,

String orgName = file.getOriginalFilename(); 
String filePath = "/Uploads/MyUploads/"+ new Date().getTime()+orgName;// Unique Image Name 
File dest = new File(filePath); 
file.transferTo(dest); 

我有一個文件夾Uploads\MarketplaceUploads,在根我的應用程序。不過還是我得到FileNotFoundException "\Uploads\MyUploads\loading.gif(系統找不到指定的路徑)」

下面是目錄結構:

enter image description here

+0

答案可能會有幫助http://stackoverflow.com/a/34162565/3627736 –

回答

3

確保您在使用前添加web應用程序上下文路徑文件

String orgName = file.getOriginalFilename(); 
String filePath = getServletContext().getRealPath("/") + "/Uploads/MyUploads/"+ new Date().getTime()+orgName;// Unique Image Name 
File dest = new File(filePath); 
file.transferTo(dest); 

getRealPath()

的Javadoc

獲取與給定虛擬路徑對應的實際路徑。 例如,如果path等於/index.html,則此方法將返回服務器文件系統上的絕對文件路徑,該文件路徑將映射到http://://index.html格式的請求,其中對應於這個ServletContext的上下文路徑。 返回的真實路徑將採用適合運行servlet容器的計算機和操作系統的形式,包括適當的路徑分隔符。 必須在應用程序的/ WEB-INF/lib目錄中綁定的JAR文件的/ META-INF/resources目錄中的資源僅在容器已從其包含的JAR文件解壓縮這些文件時才被考慮,在這種情況下,解壓縮位置必須退回。 如果servlet容器無法將給定的虛擬路徑轉換爲真實路徑,則此方法返回null。

+0

感謝它的工作。但該文件仍保存在構建目錄中。有什麼方法可以在根應用程序中保存這個圖像。因爲每次構建項目時都會清除所有上傳的文件。所以我需要將這個圖像保存在根目錄或web文件夾內(使用CSS和Js文件夾)。 PLease help – user960567

+0

@ user960567,當您的應用程序在生產環境中部署時,您的根不會可用(即)您的開發版本,您將需要使用數據庫來存儲您的信息,或者文件不會在生產中消失,因爲您不會重新部署。 – epoch

2

試試這個,

String orgName = file.getOriginalFilename(); 
// the leading slash is important 
String filePath = "/Uploads/MyUploads/"+ new Date().getTime()+orgName; 
File dest = new File(req.getServletContext().getResource(filePath).toURI()); 
file.transferTo(dest); 

使用getRealPath(),着實是一個壞主意。簡單地說,因爲您正在嘗試讀取實際駐留在應用程序內部的資源。因此,我們不需要使用getRealPath()。此外,如果應用程序正在從捆綁的.war文件運行,則getRealPath()將返回null

資源:

+0

這不起作用。我收到了同樣的錯誤。我看起來實際上和我們在ASP.NET環境中使用的一樣,比如Server.MapPath或者以〜sign – user960567

+0

@Adeel Ansari開頭的字符串,你能解釋一下爲什麼這是一個壞主意嗎? – epoch

+0

@epoch:僅僅是因爲你正在嘗試讀取實際駐留在應用程序內部的資源。我們不需要使用'getRealPath()'。此外,如果應用程序正在從一個捆綁的'.war'文件運行,'getRealPath()'將返回'null'。 –

4

你不應該上傳的文件存儲在公開網頁內容。

  • 當WAR未被容器擴展時(它可以在服務器級別配置,並且無論何時它是第三方主機都不可控),它將不會以任何方式工作。您無法以任何方式將上傳的文件寫入其中。
  • 無論何時重新部署WAR(更新),所有上傳都會丟失。你需要記住每次都要備份它們。
  • 在某些服務器中,當服務器重新啓動時,所有上傳也將丟失。無論何時它是第三方主機,您都無法控制它。

將它們存儲在服務器的webapps文件夾之外。將此位置的根作爲絕對磁盤文件系統路徑提供給您的Web應用程序,例如通過屬性文件或VM參數。另一種方法是將它們存儲在數據庫中,如果它是第三方主機不能訪問Web內容之外的固定位置,則這通常是唯一的解決方案。

+0

你的意思是我應該給絕對路徑,例如,C:\ webapps \ ....但我認爲這是一個壞主意,因爲我不知道絕對位置,直到應用程序部署在原始服務器中。 – user960567

+2

這就是爲什麼您需要使其可以通過屬性文件或VM參數,如答案中所述。如果您發現這是一個糟糕的主意,那就好了,但是一旦您在某個時候丟失了所有上傳的文件,請不要抱怨我。 – BalusC

+0

謝謝。但是,我在ASP.NET框架中看不到這些類型的問題,就像ASP.NET MVC。 – user960567

相關問題