簡體   English   中英

如何在Java中將上傳的文件存儲在項目文件夾中

[英]How to store uploaded file in project folder in Java

我是Java Web的新手,目前正在嘗試將上傳的文件(帶有servlet)存儲在項目中的文件夾中。 在web.xml中,我可以分隔完整路徑,但是完整路徑在其他人的計算機中會有所不同,並且無法正常工作,因此如何將上傳的文件存儲在我正在使用的項目中的文件夾中。 我的web.xml看起來像這樣:

<web-app>
...
<context-param> 
    <description>Location to store uploaded file</description> 
    <param-name>file-upload</param-name> 
    <param-value>
        C:\Users\George\Desktop\dataFolder\
     </param-value> 
</context-param>
...
</web-app>

但我想使路徑看起來像這樣:thisProject \\ dataFolder

有幾種方法可以這樣做,但是要點是:

您使用絕對路徑並使其依賴於部署。

Web應用程序非常特殊,您並不真正知道它們將被部署在哪里,您不能對工作目錄承擔太多責任,一旦部署,將不會有像項目文件夾這樣的東西。

因此,如果您需要一個文件夾來放置上載的文件,則只需假設您將擁有一個文件夾並使用參數來找到它。

如果將這樣的參數放在web.xml中,則可以使用服務器設置覆蓋它,如何使用它取決於所使用的應用程序服務器。

設置部署特定設置的另一種方法是使用環境變量。 因此,您可以定義一個環境變量,例如MYAPP_FILESTORAGE,並在此變量中設置文件上傳的實際路徑。

在eclipse中(我認為其他IDE也具有類似的機制),您可以為應用程序RUN / DEBUG設置環境變量。

如果無法在自己的IDE中進行設置,則仍可以在OS中將其設置為用戶變量或系統變量。

因此,在您的項目中,不會有對路徑的硬編碼引用,而是由環境變量解析的邏輯引用。

你們每個人和您的朋友只需要設置一次。

您也可以將此類信息存儲在DB上或使用特定於容器的機制。

我自己做這個確切的項目時遇到了同樣的問題。我所做的是我僅在我的projectApp中創建了存儲目錄。這是myProject / WEB-INF / saveFiles 因此,我的下載不限於任何機器。我可以在我的ubuntu / windows / mac中使用它而沒有任何問題。 既然您已經知道了為什么不應該使用絕對路徑,那么就進入解決方案。在您的servlet代碼中。假設用於存儲的目錄是FileStorage ,並且您的應用程序結構是

myProject-> WEB-INF-> FileStorage

  /*  Get the directory location.myContextPath is the path of your 
      application. It will return "somepath/myProject/". */
      File storageDirectory=new File(request.myContextPath()+"/WEB-INF/FileStorage");

    //Now check if the directory is already created or not.If its not created,then it means your application is being run for the 1st time on this machine.
    if(!storageDirectory.exists())
         storageDirectory.mkdir();

現在您已經有了一個獨立於平台的存儲目錄,現在就可以繼續保存文件了。 注意:可以說為什么我選擇FileStorage位置作為myProject / WEB-INF / FileStorage而不是myProject / FileStorage 。之所以這樣做是因為用戶可以直接訪問WEB-INF之外的任何內容。只有WEB-無法直接訪問INF,將重要內容保存在其中會更安全。

當您在servlet中獲取文件的字節時,只需在Java中使用fileoutputstream寫入即可

例如

部分p = request.getpart(“ file”);

Inputstream是= p.getinputstram();

byte [] b = IOutils.getbytes(is);

FileOutputStream fos = null;

嘗試{//創建新文件輸出流

fos = new FileOutputStream(“ C://test.txt”);

//將字節寫入輸出流

fos.write(b)中;

//將內容刷新到基礎流

fos.flush();

catch(Exception ex){//如果發生錯誤

ex.printStackTrace();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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