上回書說到strust2的文件上傳下載,上次是把文件上傳上去了,然后傻傻的在數據庫中存入了一個絕對路徑,在本機上測試取圖片的時候各種好使,小小的嘚瑟了一下,覺得文件上傳下載不過如此嘛,但是今天,就在今天把項目打包成WAR包運行的時候各種找不到圖片,我呢個郁悶啊,開始還以為是打包的時候出問題了,但是又重新打包運行還是不行,后來去看數據庫才知道了是上傳路徑的問題,本機的tomcat是裝在d盤,但是打的war包運行的環境tomcat是裝在c盤,所以找不到路徑了,那么在顯示的時候肯定是有問題的:
文件上傳的時候需要給出上傳路徑,這時候的路徑是絕對路徑,但是往數據庫中存的時候需要存相對路徑:
//得到工程保存圖片的路徑 String root = ServletActionContext.getServletContext().getRealPath("/ima"); File destFile = new File(root); //如果不存在就創建 if (!destFile.exists()) { destFile.mkdirs(); } InputStream is = new FileInputStream(ima); //把圖片寫入到上面設置的路徑里 OutputStream os = new FileOutputStream(destFile+ "http://"+imaFileName); try { byte[] b = new byte[1024];// 每次寫入的大小 int j = 0; while ((j = is.read(b)) > 0) { os.write(b, 0, j); } } catch (Exception e) { e.PRintStackTrace(); } finally { is.close(); os.close(); }上面代碼中的root是絕對路徑,絕對路徑是什么意思呢?比如說D:/Tomcat 6.0/webapps這就是一個絕對路徑,那什么是相對路徑呢?Tomcat 6.0/webapps就是一個相對路徑,切記相對路徑最前面是沒有斜線的哦。上傳文件時候是相對路徑,但是在存入數據庫中的時候卻要存入相對路徑,怎么辦?如下:
String fileUrl="ima"+"http://"+imaFileName; sysUser.setImgUrl(fileUrl);
這樣得到的就是一個相對路徑,中間的//是為了轉譯/。
數據庫存入的相對路徑在下載文件的時候也是個麻煩,最少對我是個麻煩,因為下載的時候從數據庫查到的是相對路徑,你還需要把相對路徑還原成絕對路徑,不然這哥們兒不搭理你啊,你肯定取不到這個文件。
取文件跟路徑以前使用的都是request.getRealPath(path);但是這哥們兒現在不好使了,也不能說不好使了,就是老了該休息休息了,所以換新的來了,新的方法是:
request.getsession().getServletContext().getRealPath(path);
只需要把path換成你的相對路徑就可以找到這個文件了,然后下載的話就是一個I/O流的事了。
String path=request.getSession().getServletContext().getRealPath("ima//"+imgName); File file = new File(path); // 以流的形式下載文件。 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 設置response的Header response.setContentType("application/x-download"); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(imgName,"utf-8")); response.addHeader("Content-Length", "" + file.length()); OutputStream toClient = response.getOutputStream(); toClient.write(buffer); toClient.flush(); toClient.close();恩,暫時就這樣了。
新聞熱點
疑難解答