2011-07-28 2 views
-2

URL을 통해 이미지를 읽고 JSP 페이지에서 렌더링하는 가장 좋은 방법은 무엇입니까?JSP/서블릿 : URL을 통해 이미지를 읽고 JSP 페이지에서 렌더링하는 방법 (이미지 URL이 공개되지 않음)

지금까지 두 개의 JSP 페이지를 코딩했습니다.

EDIT START :

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

편집 END :

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 유형이므로 img가 작동하지 않습니다. /ImageServ.jsp:57를 말한다 오류가있어 : 기호 기호를 찾을 수 없습니다 : 방법 쓰기 (java.awt.image.BufferedImage) 위치 : 클래스 java.io.OutputStream에 \t \t \t \t o.write (IMG); – Satish

+0

@Satish : 응답으로 코드를 업데이트했습니다. – zacheusz

+0

감사합니다. 하지만 여전히 JSP로 출력 스트림에 BufferedImage를 성공적으로 작성하는 방법을 찾으려고합니다. – Satish

0

고전적인 질문입니다. 예를 들면 다음과 같습니다. http://www.exampledepot.com/egs/javax.servlet/GetImage.html

또한 JSP에서 코딩하는 모든 작업을 수행하지 마십시오. 프런트 엔드 렌더링 코딩 전용으로 유지하십시오. 백엔드 클래스에서 Java 코딩을 수행하십시오.

0

끔찍하고 지독한 코드. 절대로 컨트롤러 로직을 JSP로 작성하지 마십시오. 왜 JSP를 사용해야할까요? 바이너리 데이터를 JSP 출력 스트림에 쓸 수 없습니다. 스트림은 이미 텍스트 출력을 위해 초기화되었습니다. 로직을 서블릿에 넣고 입력 스트림을 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 새로 고치기는 쉽고 변경 및 페이지 다시로드를 수행하면 변경 사항이 실행됩니다. 무슨 일이 있어도 내 일식이 "Publish"를 묻는 것처럼 서블릿이 새로 고침되는 목의 고통이 있습니다. – Satish

+0

그래도 결코 그런 접근 방식에 익숙하지 않아도됩니다. 저렴한 서블릿 접근법은 위를 참조하십시오. –

+0

공유 입력란에 파이핑 입력 스트림에 대한 예제가 있습니까? – Satish

관련 문제