![](/img/trans.png)
[英]Java EE Application with Web Server + Application Server
[英]How to store a file on a server(web container) through a Java EE web application?
我開發了一個 Java EE 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
並且文件沒有不存儲在服務器上。
當我檢查ServletContext.getRealPath()
方法的 API 時,我發現以下內容:
public java.lang.String getRealPath(java.lang.String path)
返回一個包含給定虛擬路徑的真實路徑的字符串。 例如,路徑
"/index.html"
返回服務器文件系統上的絕對文件路徑,它將由對"http://host/contextPath/index.html"
的請求提供服務,其中 contextPath 是此 ServletContext 的上下文路徑.返回的真實路徑將采用適合運行 servlet 容器的計算機和操作系統的形式,包括正確的路徑分隔符。 如果 servlet 容器出於任何原因(例如當內容從 .war 存檔中可用時)無法將虛擬路徑轉換為真實路徑,則此方法返回 null。
那么,有沒有其他方法可以將文件存儲在這些服務器上,並且為getServlet().getServletContext().getRealPath("")
返回null
根據規范,您可以保證從 servlet 容器中獲得的唯一“真實”路徑是臨時目錄。
您可以通過ServletContext.gerAttribute("javax.servlet.context.tempdir")
獲得它。 但是,這些文件對 Web 上下文不可見(即您不能發布一個簡單的 URL 來傳送這些文件),並且不能以任何方式保證這些文件在 Web 應用程序或服務器重新啟動后仍然存在。
如果您只需要一個地方來短時間存儲工作文件,那么這對您來說很合適。
如果你真的需要一個目錄,你可以把它作為一個配置參數(一個環境變量,一個 Java 屬性(即java -Dyour.file.here=/tmp/files ...
),一個在 web 中設置的上下文參數。 xml,通過 Web 表單等存儲在數據庫中的配置參數)。 然后由部署者為您設置此目錄。
但是,如果您需要稍后實際提供該文件,您將需要一個特定於容器的機制來將外部目錄“掛載”到您的 Web 應用程序中(Glassfish 作為“備用文檔根”,其他人有類似的概念),或者您將需要編寫一個 servlet/過濾器來在您的 Web 應用程序之外提供文件存儲。 這個FileServlet非常完整,正如您所見,創建您自己的FileServlet雖然並不困難,但要做好它並非易事。
編輯:
基本要點是相同的,但不使用“getRealPath”,只需使用“getInitParameter”。
所以:
String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName;
並在路上。
再次編輯:
至於路徑的內容,我會給它一個絕對路徑。 否則,您需要知道應用服務器在執行期間將其默認路徑設置為何處,並且每個應用服務器很可能使用不同的目錄。 例如,我認為 Glassfish 的工作目錄是運行域的 config 目錄。 不是特別明顯的選擇。
因此,絕對使用絕對路徑。 這樣您就知道文件的去向,並且如果有必要,您可以在操作系統級別控制該目錄的訪問權限。
不建議從 Java EE 容器寫入文件系統,特別是如果您需要處理寫入的數據:
如果這是一個選項,我會將文件存儲在數據庫中或使用 JCR 存儲庫(如Jackrabbit )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.