开发者

JSP/Servlet : How to Read an image via URL and render it on a JSP page (image URL is not public)

开发者 https://www.devze.com 2023-03-24 03:27 出处:网络
what\'s the best approach to read an image via URL and render it on a JSP page? so far, I\'ve coded two JSP pages.

what's the best approach to read an image via URL and render it on a JSP page?

so far, I've coded two JSP pages.

EDIT START:

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

EDIT 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));
    }
%>

But this doesn't seem to be working: all the time i see this error:

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)

Any ideas on how to get this working???


Your image data is already encoded so you can simply write it: ImageIO.write(img, "jpeg", response.getOutputStream());. You don't need to (and can't) use JPEGImageEncoder.


Classic question. Here's an example: http://www.exampledepot.com/egs/javax.servlet/GetImage.html

Also, don't do all that coding in a JSP - keep that for front-end rendering coding only; do the Java coding in a backend class.


Terrible and awful code. NEVER EVER write controller logic in a JSP that's why I have JSP to the guts. You cannot write binary data to a JSP output stream. The stream has already been initialized for text output. Put your logic in a servlet and pipe the input stream to the response output stream with Commons IO. This will work. If you still insist on that crappy solution, you will need to write a filter which completely wraps the response and serves binary data instead. See this for reference and examine its code. Good luck.

Edit:

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

This is how I pipe PDF from local disk but there is no difference to serving from a URL.

0

精彩评论

暂无评论...
验证码 换一张
取 消