原來工程的上傳圖片存儲地址在web應用的目錄下,並且是硬編碼到其中的:
每次使用maven tomcat:redeploy以后,這個目錄就沒有了。
現在想要把上傳圖片的位置移動到tomcat的webapps目錄中專門存放圖片的一個目錄下。
即,新建的一個images目錄用來存放web應用的圖片們。
這樣就把工程和用戶上傳圖片分離了,以后在redeploy時也不用預先備upload目錄,然后再拷貝回去,因而在web應該更新時比較方便些。此外,還想改變文件路徑被硬編碼到java文件中的現狀,所以將文件的存儲位置預先定義在web.xml中,這樣將來再改變位置的時候就不需要再回去改動代碼了。
要完成上述目的,需要更新的地方有三個:
一、在web.xml中設置保存上傳圖片的路徑
二、更新與上傳圖片相關的java類,去掉硬編碼的部分,將路徑改為從servletContext讀取,由web.xml統一配置。
三、更新MySQL數據庫中已經存在的數據中的鏈接路徑
下面記錄更新的過程:
一、在web.xml中設置保存上傳圖片的路徑
<context-param> <param-name>UPLOAD_IMAGE_PATH</param-name> <param-value>../images/wiqun/upload/</param-value> </context-param>
二、更新與上傳圖片相關的java類
上傳圖片使用的是smartUpload。先通過servletContext獲得UPLOAD_IMAGE_PATH參數的地址,保存在image_path這個String變量中。
2.1從servletContext中獲得上傳文件保存的地址
String image_path = this.getServletContext().getInitParameter("UPLOAD_IMAGE_PATH");//從配置文件中讀取要保存的位置
這個地址在使用之前別忘了在代碼中測試一下是否存在該目錄,若不存在要創建,否則會拋出exception。
2.2使用指定的路徑保存上傳的圖片
1 su.upload(); 2 3 for (int i = 0; i < su.getFiles().getCount(); i++) { 4 com.wiqun.smartUpload.File myfile = su.getFiles().getFile(i); 5 //直接提取或另外生成圖片的文件名,保存在fileName變量中 6 ........ 7 //將上傳的圖片以fileName為名,保存到image_path指定的目錄下 8 myfile.saveAs(image_path + fileName); 9 10 }
第8行中的image_path就是在web.xml文件中指定的UPLOAD_IMAGE_PATH參數的值。
2.3測試
UPLOAD_IMAGE_PATH參數指定的目錄下:
三、更新MySQL數據庫中已經存在的測試數據中的鏈接路徑
數據庫中存有曾經的測試數據,其中的圖片路徑還是"upload/xxxxxx.jpg"格式的。現在要把它們替換成我們在web.xml中定義的新路徑"../images/wiqun/upload/xxxxx.jpg"格式。此過程可以使用MySQL的replace語句來完成。現在,我們要把sight表格中的introduction列中的“upload/”替換成“../images/wiqun/upload/”,語句為:
update sight set introduction = replace(introduction,'upload/','../images/wiqun/upload/');
格式為 update 表名 set 列名 = replace(列名,'被替換的字串','替換的字串')
執行前,數據庫introduction列部分截圖如下:
wiqun是web應用的名稱。當前所有用戶上傳的圖片都是存放在wiqun目錄的upload目錄下,就像文章一開始所顯示的截圖。
在執行了上述replace語句后,MySQL提示如下:
現在再看看數據庫里的狀態:
可以看到路徑名都已經完成替換了。
在瀏覽器中測試圖片是否可以瀏覽:
至此,就完成了web應用中,上傳文件的路徑替換。
以后如果還要更改路徑,只需要更改web.xml中UPLOAD_IMAGE_PATH參數的值,並且更新數據庫中的鏈接即可,不需要再改動代碼了。硬編碼真是有些傷不起。不知道數據庫中是不是也可以預先定義一個變量什么的,然后也直接綁定到配置文件中,這樣以后也不需要手工更新數據庫了。
至於別的大神說用雲存儲的方式進行存儲,小編在此還不會,哪位大神要會的話進行個留言,萬分感謝!