因為項目部署在jboss上面,在上傳一些圖片的時候,把他上傳到當前項目的下,比如:(這里是以Windows服務器為例的,當然linux也是一樣的)
D:\jboss-eap-6.4\domain\servers\8080\tmp\vfs\temp\temp5e9f137492dc6baa\content-295f90957d15c1af
這個路徑當你再次部署jboss的時候,他就會把后面紅色標記的目錄給重新生成一下且存在這些目錄下的文件都會被刪掉,所以當時想把圖片利用:
String savePath = request.getSession().getServletContext().getRealPath("");
得到當前項目所在的物理磁盤路徑,存儲到其中的方法是不好實現的。之后有想到了在服務器上面部屬個ftp,把圖片什么都存儲到ftp上面,然后把ftp的存儲路徑放到數據庫中,這個方法是可行的,但是有的時候ftp服務器跟程序的應用服務器是分開的,所以當ftp服務器當機的時候,圖片就存儲不到了。然后就想到了把圖片存儲到jboss的根目錄下的某個文件夾下,
String tempPath = System.getProperty("user.dir");
當成一個中轉站,如果重新部署了war包,使得圖片沒有了,再從中轉的目錄中復制過來,主要的代碼如下:
String saveName = dto.getDiplomatIdentity(); //從數據庫中得到存儲的相對路徑 String tempPath = System.getProperty("user.dir"); String savePath = request.getSession().getServletContext().getRealPath(""); //中轉站路徑中的文件 File tempPathFile = new File(tempPath + "\\" + saveName); //項目的相對路徑(目錄) File savePathFile = new File(savePath + "\\resources\\acs_imgs\\shipper\\"); //如果當前項目對於的相對路徑下沒有對應的圖片。就從中轉目錄下拷貝一份,有的話就跳過此方法 // 如果中轉目錄下都沒有文件,那么直接跳過。 File imgFile = new File(savePath + "\\" + saveName); if (!imgFile.exists()) { if (tempPathFile.exists()) { //當前項目的相對路徑沒有對應的目錄,新建 if (!savePathFile.exists()) { savePathFile.mkdirs(); } //得到中轉目錄的 文件流 FileInputStream fis = new FileInputStream(tempPath + "\\" + saveName); //輸出到 當前目錄下 FileOutputStream fos = new FileOutputStream(savePath + "\\" + saveName); int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } fis.close(); fos.close(); } }
當然File文件的操作,有個File#renameTo(File)方法,這個方法也是可行的,但是有的時候,他會出現小小的問題即:
不同盤符的分區格式不同,之間互相用File#renameTo(File)方法的時候,有可能會不成功的,具體看 http://xiaoych.iteye.com/blog/149328 和 http://www.iteye.com/topic/149328