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

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

Решение

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

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

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

Страшный и ужасный код. НИКОГДА не пишите логику контроллера в JSP, поэтому у меня есть JSP для кишок. Вы не можете записать двоичные данные в выходной поток JSP. Поток уже инициализирован для вывода текста. Поместите свою логику в сервлет и направьте входной поток в выходной поток ответа с помощью Commons IO. Это будет работать Если вы все еще настаиваете на этом дрянном решении, вам нужно будет написать фильтр, который полностью обернет ответ и вместо этого будет обслуживать двоичные данные. Смотрите это для справки и изучите его код. Удачи.

Редактировать:

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

Вот как я передаю PDF с локального диска, но нет разницы с передачей по URL.

Другие вопросы по тегам