![](/img/trans.png)
[英]How to get uploaded file to local folder in spring surf java webscript?
[英]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.