將byte[]陣列轉換為影像輸出到頁面

鴨脖發表於2013-05-06
  1. //  
  2. byte[] imageData = (byte[]) ImageUtil.getImage(...);  
  3.                  
  4. response.setContentType("image/png");  
  5. OutputStream output = response.getOutputStream();  
  6. InputStream in = new ByteArrayInputStream(imageData);  
  7. int len;  
  8. byte[] buf = new byte[1024];  
  9. while ((len = in.read(buf)) != -1) {  
  10.    output.write(buf, 0, len);  
  11. }  
  12. output.flush();  
  13. //如果沒有下面兩行,可能出現getOutputStream() has already been called for this response的異常  
  14. out.clear();  
  15. out = pageContext.pushBody();  

以上是在jsp頁面中顯示一個圖片。注意在讀取圖片的時候,圖片的路徑問題。因為tomcat讀取檔案是要參照伺服器上的路徑的,所以你需要getRealPath,像下面:
File file = new File(request.getServletContext().getRealPath("/")+"jsp\\2.jpg");

下面簡單說一下我在這次圖片顯示的思考中所得到的:
我的需求是從資料庫中讀取出圖片的位元組流,然後儲存成byte[],然後將這些byte[]陣列轉換成圖片顯示在jsp頁面山。我想把根據byte[]轉換成圖片並且顯示的這項功能寫成一個servlet,然後通過img標籤來顯示圖片。

得到上面的程式之後,我想這就好辦了,由於我不僅要顯示頭像,還要顯示菜餚的圖片,店鋪的圖片等,因而我在邏輯jsp中讀取出來持久化物件中的byte[]成員,然後將這個陣列直接通過引數的形式傳遞給servlet,servlet再根據byte[]返回影像,這樣最後就可以成功顯示了,而且程式還具有很高的靈活性。

但是我失敗了。。。瀏覽器在解析的時候總是崩潰。。。。。根本無法顯示頁面

原因後來我想明白了,因為我把圖片的最大容量限制為2M,這樣我的引數的十六進位制字串的最大容量就是2M,這些資訊在瀏覽器進行遍歷和解析的時候,會被儲存在dom節點的,但是一個dom節點的最大容量是多少呢?我想瀏覽器是有規定的,引數大小也應該是有限制的,因而發生了記憶體溢位,造成瀏覽器崩潰。。。後來我把引數去掉之後,成功的顯示了圖片。

但是這樣以來,我怎麼知道該顯示哪張圖片呢?

現在的想法是,傳遞的引數應該換一換。換成什麼呢?根據type的內容分類,然後再根據不同的型別進行細節化,因為很多持久化物件已經儲存在了固定的欄位值session物件中,那麼我們可以取得這個物件,然後取出byte陣列,最後再顯示。這隻能這麼做了現在。

相關文章