JSP / Servlet: как прочитать изображение через URL и отобразить его на странице JSP (URL изображения не является общедоступным) - PullRequest
0 голосов
/ 28 июля 2011

Каков наилучший подход для чтения изображения через 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 ]

2 голосов
/ 28 июля 2011

Ваши данные изображения уже закодированы, поэтому вы можете просто написать их: ImageIO.write(img, "jpeg", response.getOutputStream());.Вам не нужно (и не можете) использовать JPEGImageEncoder.

0 голосов
/ 28 июля 2011

ужасный и ужасный код.НИКОГДА не пишите логику контроллера в 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.

0 голосов
/ 28 июля 2011

Классический вопрос.Вот пример: http://www.exampledepot.com/egs/javax.servlet/GetImage.html

Кроме того, не делайте все это кодирование в JSP - сохраняйте это только для кодирования рендеринга переднего плана;выполнить Java-кодирование в бэкэнд-классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...