簡體   English   中英

如何通過 Java EE Web 應用程序將文件存儲在服務器(Web 容器)上?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM