我開發了一個Java EE web應用程序。此應用程序允許用戶在瀏覽器的幫助下上傳文件。一旦用戶上傳了他的文件,該應用程序首先將上傳的文件存儲在服務器上(它正在運行),然後對其進行處理。如何通過Java EE Web應用程序將文件存儲在服務器(Web容器)上?
目前,我在服務器上存儲文件,如下所示:
try {
// formFile represents the uploaded file
FormFile formFile = programForm.getTheFile();
String path = getServlet().getServletContext().getRealPath("") + "/"
+ formFile.getFileName();
System.out.println(path);
file = new File(path);
outputStream = new FileOutputStream(file);
outputStream.write(formFile.getFileData());
}
何地,formFile
表示上傳的文件。現在
,問題是,它是運行良好,在某些服務器上,但在某些服務器上的getServlet().getServletContext().getRealPath("")
將返回null
讓我得到最終的路徑是null/filename
和文件不在服務器上存儲。
當我檢查API爲ServletContext.getRealPath()
方法,我發現了以下內容:
public java.lang.String getRealPath(java.lang.String path)
返回包含對於給定的虛擬路徑的實際路徑的字符串。例如,路徑
"/index.html"
返回服務器文件系統上的絕對文件路徑將由請求"http://host/contextPath/index.html"
提供服務,其中contextPath是此ServletContext的上下文路徑。返回的真實路徑將採用適合運行servlet容器的計算機和操作系統的形式,包括正確的路徑分隔符。如果servlet容器由於某種原因無法將虛擬路徑轉換爲真實路徑(例如,從.war歸檔中使內容可用時),則此方法返回null。
那麼,有沒有用,我可以存儲在返回null
爲getServlet().getServletContext().getRealPath("")
@Pascal我只想存儲一個文件以便稍後處理。所以我認爲將該文件存儲在數據庫中不是一個好主意?你怎麼看?該文件是一個.csv文件。如果你認爲我應該將它存儲在數據庫中,那麼我應該以字節形式還是以任何其他形式存儲它,因爲文件的大小可以爲100或200 MB。其次,我第一次聽說「Jackrabbit」,我不知道它是什麼。我看着它的網站,但沒有找到任何教程。那麼你能告訴我哪一個更好:使用數據庫還是使用「Jackrabbit」? – 2010-04-20 09:30:13
@Yatendra我是寫入文件系統的「記錄」的潛在缺陷。對於許多應用程序來說,這可能不是一個選項,但對您而言可能不是問題。現在,回答你的問題...... 1)寫入數據庫可以完成(在LOB中);這並不理想,但如果你每天不寫幾千個文件,那應該沒問題。 2)Jackrabbit是JCR API(JSR-170)的一個實現,它是將文件寫入和存儲到內容存儲庫的標準API,因此也是一種替代方案。但是對於一個小應用程序來說,使用JCR存儲庫聽起來有點過分。 *我*會使用數據庫。 – 2010-04-20 16:24:32
我有一個類似的問題,但我需要存儲小文件 - 所以使用任何需要單獨設置和支持的數據庫是一個很大的開銷。因此,對這個答案投下贊成票並投票贊成@Will Hartung的答案 - 因爲它讓我對簡單問題更加簡單。 – Vladimir 2011-05-18 05:49:34