JSP / Servlet:如何通过URL读取图像并在JSP页面上呈现(图像URL不公开)

时间:2011-07-28 18:41:25

标签: java image jsp

通过URL读取图像并在JSP页面上呈现图像的最佳方法是什么?

到目前为止,我编写了两个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)

关于如何使这个工作的任何想法???

3 个答案:

答案 0 :(得分:2)

您的图片数据已经过编码,因此您可以简单地编写它:ImageIO.write(img, "jpeg", response.getOutputStream());。您不需要(也不能)使用JPEGImageEncoder

答案 1 :(得分:0)

经典问题。这是一个例子:http://www.exampledepot.com/egs/javax.servlet/GetImage.html

此外,不要在JSP中进行所有编码 - 只保留前端渲染编码;在后端类中进行Java编码。

答案 2 :(得分: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提供服务没有区别。