Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > показать в JSP картинку из Stream'а


Автор: Sleepy_PIP 3.6.2005, 15:17
Собственно думаю, решаю, пока ничего в голову не лезет.
Надо показать в JSP страничке картинку юзеру, которая на сей момент (на момент работы JSP серверлета) находится в памяти.
Пока все сваливаюсь на то, что надо предварительно сохранить в файл, и давать уде ссылку на ф. в страничке ... но не нравится мне это ...

Автор: batigoal 3.6.2005, 15:25
Наверное, по-другому никак. Разве что в апплете рисовать.

Автор: tux 4.6.2005, 03:11
А такой вариант не пойдет?
Код

public class ImageServlet extends HttpServlet {
    
    private byte[] imageContent;

    public void init() throws ServletException {
    }

    protected void doGet(
            HttpServletRequest request, 
            HttpServletResponse response) 
        throws ServletException, IOException {
        
        // взяли изображение
        imageContent = imageGenerator.getImage();
        
        // установили контент
        response.setContentType("image/png");
        
        // записали в выходной поток
        response.getOutputStream().write(imageContent);
    }
    
}

и ссылку на сервлет положить в JSP

Автор: Grelloo 26.5.2006, 08:28
А можно объяснить эту строчку:
Код

        // взяли изображение
        imageContent = imageGenerator.getImage();

Не понятно как массиву byte[] было присвоен тип Image 

Автор: tux 26.5.2006, 08:44
Цитата(Grelloo @  26.5.2006,  13:28 Найти цитируемый пост)
Не понятно как массиву byte[] было присвоен тип Image  

Не понял, что за тип Image?

Массив байтов можно по почте получить, по ссылке закачать или из файла прочитать, например, так:
Код

InputStream fis = new FileInputStream("bla-bla.file");
ByteArrayOutputStream image = new ByteArrayOutputStream();
        
byte[] buf = new byte[8192];
        
int readCount = 0;
        
while ((readCount = fis.read(buf)) >=0 )
    image.write(buf, 0, readCount);
        
fis.close();
        
byte[] imageContent = image.toByteArray();
 

Автор: Grelloo 26.5.2006, 09:39
А если есть просто Image, то его как-то можно преобразовать в поток байт? (То бишь получаем сразу Image например из базы данных) 

Автор: batigoal 26.5.2006, 10:04
Попробуй так:
Код

byte[] buffer = null;
 
try {
    BufferedImage image = ImageIO.read(this.getClass().getResource("images/someimage.jpg"));
    
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", bos);
 
    buffer = bos.toByteArray();
} catch (Exception e) {
    e.printStackTrace();
}
 

Автор: Grelloo 26.5.2006, 11:40
Написал следующее:
Код

        String LAUNCH = "D:\\books.gif";
        response.setContentType("image/gif");
        ServletOutputStream out = response.getOutputStream();
        try {
        BufferedImage bimage =   ImageIO.read(this.getClass().getResource(LAUNCH));
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(bimage, "gif", bos); 
        byte[] buffer = null;
        buffer = bos.toByteArray();
        out.write(buffer);
        } catch (Exception e) {
         e.printStackTrace();
        } 

Получаю ошибку:
Код

java.lang.NullPointerException
        at prob.MultiResponse.processRequest(MultiResponse.java:28)

 

Автор: tux 26.5.2006, 12:39
Grelloo, в какой строке исключение вываливается? Телепаты в отпуске. Кроме того, мне совершенно не ясно если ты читаешь массив байтов из файла (или из базы данных или еще откуда-то), то зачем эти промежуточные классы типа BufferedImage, у тебя же здесь изображение два раза хранится. 

Автор: Grelloo 5.6.2006, 11:15
В конечном итоге у меня получилось следующее:
package com.softmast.webportal.kernel.image;

Код

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class ShowImageServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String LAUNCH = "D:\\tomcat.gif";
        FileInputStream in = new FileInputStream(LAUNCH);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            for (int i = in.read(); i > -1; i = in.read()) {
                out.write(i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        byte[] rgb = out.toByteArray();
        if (rgb != null) {
            response.reset();
            response.setContentType("image/jpeg");
            response.setContentLength(rgb.length);
            ServletOutputStream stream = response.getOutputStream();
            System.out.write(rgb);
            stream.write(rgb);
            stream.flush();
            stream.close();
        } else {
            response.setContentType("text");
            response.getWriter().write("attribute byteArray not found");
        }
    }
}


Очень удобно, теперь можно в jsp странице передавать картинку, вызывая соответствующий сервлет.  

Автор: tux 5.6.2006, 11:32
Grelloo, у тебя в данном случае не по делу все содержимое картинки загружается в память. Почему бы не писать сразу из входного потока файла в выходной поток response?
Код

String LAUNCH = "D:\\tomcat.gif";

FileInputStream in = new FileInputStream(LAUNCH);
ServletOutputStream out = response.getOutputStream();

response.setContentType("image/jpeg");

for (int i = in.read(); i > -1; i = in.read())
    out.write(i);

out.flush();
out.close();
in.close();

 

Автор: Grelloo 5.6.2006, 12:05
Пример действительно с точки зрения оптимизации не совсем хорош, но зато можно сделать метод, который бы позволял получать картинку как поток byte, что достаточно удобно 

Автор: garbuz 25.2.2009, 19:09
У меня похожая проблема, есть бин, у которого одно из полей типa byte [], туда на стороне сервлета помещаю изображение.
Потом через requestDispatcher передаю этот бин на jsp, как мне вытащить изображение и отобразить его на странице?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)