2011-07-28 45 views
-2

通過URL讀取圖像並將其呈現在JSP頁面上的最佳方法是什麼?JSP/Servlet:如何通過URL讀取圖像並將其呈現在JSP頁面上(圖像URL未公開)

到目前爲止,我編寫了兩個JSP頁面。

編輯開始:

*Experimental: Obviously the ImageServ will be a servlet, not a jsp. 

編輯結束:

index.jsp 

<%page .... 
<html> 
...... 
<img src="ImageServ.jsp?url=http://serveripaddress/folder/image.jpg" /> 
..... 


ImageServ.jsp 
<%@page import="javax.imageio.ImageIO"%> 
<%@page import="java.net.URL"%> 
<%@page import="java.io.*, java.awt.*, java.awt.image.*,com.sun.image.codec.jpeg.*" %> 
<% 
    try { 
     String urlStr = ""; 
     if(request.getParameter("url") != null) 
     { 
      urlStr = request.getParameter("url"); 
      URL url = new URL(urlStr); 
      BufferedImage img = null; 
      try{ 
        img = ImageIO.read(url); 
        out.println(" READ SUCCESS" + "<br>"); 
      }catch(Exception e) { 
        out.println("READ ERROR " + "<br>"); 
        e.printStackTrace(new PrintWriter(out)); 
      } 

      try { 
        response.setContentType("image/jpeg"); 
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream()); 
        encoder.encode(img); 
       }catch(Exception ee) { 
          response.setContentType("text/html"); 
          out.println("ENCODING ERROR " + "<br>"); 
          ee.printStackTrace(new PrintWriter(out)); 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(new PrintWriter(out)); 
    } 
%> 

但這似乎並沒有被工作: 所有的時間我看到這個錯誤:

READ SUCCESS 
ENCODING ERROR 
java.io.IOException: reading encoded JPEG Stream 
    at sun.awt.image.codec.JPEGImageEncoderImpl.writeJPEGStream(Native Method) 
    at sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:476) 
    at sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:228) 

任何想法如何得到這個工作?

回答

2

您的圖像數據已被編碼,因此您可以直接編寫它:ImageIO.write(img, "jpeg", response.getOutputStream());。您不需要(也不能)使用JPEGImageEncoder

+0

沒有工作,因爲img是BufferedImage類型;得到了,說/ImageServ.jsp:57一個錯誤:無法找到符號 符號:方法寫(java.awt.image.BufferedImage中) 位置:類java.io.OutputStream中 \t \t \t \t o.write(IMG); – Satish

+0

@Satish:我已經更新了代碼。 – zacheusz

+0

謝謝!但仍試圖找到一種方法將BufferedImage成功寫入jsp outputstream。 – Satish

0

糟糕可怕的代碼。永遠不要在JSP中編寫控制器邏輯,這就是爲什麼我要把JSP放在心上的原因。您不能將二進制數據寫入JSP輸出流。該流已經被初始化爲文本輸出。把你的邏輯放在一個servlet中,並通過Commons IO將輸入流傳遞給響應輸出流。這將工作。如果你仍然堅持這個蹩腳的解決方案,你需要編寫一個完全包裝響應並提供二進制數據的過濾器。請參閱this以供參考並檢查其代碼。祝你好運。

編輯:

doGet(...) { 
    response.setContentType("image/jpeg"); 
    String url = request.getParameter("url"); 
    ... 
    InputStream is = ....getInputStream(); 
    IOUtils.copy(is, response.getOutputStream()); 
    // cleanup 
    } // done 

這是從本地磁盤我怎麼管的PDF,但有從URL服務沒有區別。

+1

這是一個實驗代碼!並且刷新JSP很容易,進行更改和頁面重新加載,您已經更改並運行。出於某種原因,讓servlet更新是一件痛苦的事情,因爲我的eclipse要求「發佈」 – Satish

+0

儘管從來不習慣於這種方法。 請參閱上文以獲取便宜的servlet方法。 –

+0

管道輸入流與commons io上的任何示例? – Satish

相關問題