最近在做一個Javaweb的項目,涉及到圖片上傳,並且需要將圖片通過URL回顯給JSP頁面,在調試的時候發現,上傳到tomcat的圖片再重新部署之后就消失了。研究了半天發現才解決了。首先說一下,我為什么要將圖片存放到tomcat服務器或者更直白點說是web工程目錄下的原因:
項目中對於圖片的處理在於用戶上傳比如自己的頭像,上傳后再查看時,就直接根據服務器的URL指定圖片的位置去查看圖片,通俗點就是jsp頁面中的<img >標簽的src屬性的路徑就直接指向服務器該圖片存放的位置。鑒於這一點,所以將圖片文件存放在了tomcat中,而不放在服務器磁盤文件系統中,這樣前端JSP就可以直接通過URL訪問到圖片資源。
發現的問題:在調試的時候,我的開發環境十分通用,就是eclipse for jee ,服務器為tomcat7.0。在配置eclipse runtime服務器運行環境時,工程發布的位置選擇的是直接將工程發布到tomcat的webapps目錄下。配置過程如下:
1.在為eclipse添加到tomcat7.0服務器后,將服務器的工程全部remove掉,如下圖:
remove all,然后右鍵clean一下,這時再open,如下圖
在server locations下選擇第二個,這時工程在ADD到服務器時就直接到了tomcat 的webapps目錄下了。
遇到的問題:發現上傳的圖片在改動eclipse上的代碼的時候,也就是重新部署后,tomcat下的webapps中的工程目錄下的圖片全部沒有了,很奇怪,經過研究發現,原因如下:
我們在Java代碼中上傳圖片時,圖片的路徑是通過代碼
request.getSession().getServletContext().getRealPath("/img")
來獲取路徑的,而這句代碼返回的路徑是tomcat中webapps目錄下的工程路徑,圖片就直接保存到了tomcat中。
當我們重新發布工程的時候,tomcat其實是先將原來的工程刪掉,然后再將改動過的新的工程放上去。而改動過的新的工程師來自與我們eclipse的工作空間中的工程,這就也難怪了,因為我們是把圖片直接上傳到的tomcat服務器下,而不是放到工作空間的工程目錄下,自然重新部署后圖片就沒了。
解決辦法:
歸根到底的原因就是因為
request.getSession().getServletContext().getRealPath("/img")
這句代碼搞的鬼,所以在調試時,我們在Java代碼中保存上傳的圖片位置時將圖片的保存路徑應該保存在eclipse工作空間的目錄下,如:
String path = "E:\\program\\eclipse project\\Server\\WebContent\\img";
這樣,圖片在上傳到該工作空間后,因為項目發生了改變,eclipse會再次發布工程,這時圖片便會同步到tomcat服務器中,這時,我們前端jsp頁面也就可以通過URL定位到圖片了。
注意的地方:
歸根到底這些問題其實還是因為我們是在調試的工程中,發布后肯定是不會出現這些問題的。因為你想想我們的web工程一般是發布到Linux下,發布了之后你的tomcat服務器只有關閉和打開,而不會對工程重新部署,自然也就不會出現這些問題。然后這也同時出現了另外一個問題,就是我們的web系統是在Linux下,也不會有eclipse環境,那也就更不用談什么工作空間了,所以如果在代碼中String path = "E:\\program\\eclipse project\\Server\\WebContent\\img";這么寫系統肯定會報錯咯。所以最終來說,改成這樣也只是權宜之計,方便我們在調試的時候用的,到項目正式發布的時候需要我們再將路徑改成request.getSession().getServletContext().getRealPath("/img")的。