Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Exibir imagem da Servlet para o .jsp

Como eu faço para pegar uma lista de imagens blobs do banco, passar pela servlet e exibir elas em um jsp? As imagens vem do dao.getList();

@WebServlet("/listaProdutosServer")
public class ListaProdutosServer extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ProdutoDao dao = new ProdutoDao();

        List<Produto> produtos = dao.getList();
        request.setAttribute("produtos", produtos);


        RequestDispatcher rd = request.getRequestDispatcher("/lista-produtos.jsp");
        rd.forward(request, response);

    }

}

A parte do jsp que recebe o produto é:

<c:forEach var="produto" items="${produtos}">
            <tr>
              <th scope="row">${produto.id}</th>
              <td>${produto.nome}</td>

              <td>${produto.imagem}</td>

              <td> ...

O Dao é este:

public List<Produto> getList() {
        String sql = "select * from Produtos";
        List<Produto> produtos = new ArrayList<>();

        try (PreparedStatement stmt = connection.prepareStatement(sql)) {
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                Produto produto = new Produto();
                produto.setId(rs.getInt("id"));
                produto.setNome(rs.getString("nome"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setIndicacao(rs.getString("indicacao"));
                produto.setVolume(rs.getString("volume"));
                produto.setCustoUnid(rs.getInt("custoUnid"));
                produto.setSugestaoVenda(rs.getInt("sugestaoVenda"));
                produto.setImagem(rs.getBytes("imagem"));
                produtos.add(produto);

            }
            return produtos;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

Isto é possível?

6 respostas
solução!

Oi Aluízio,

Uma ideia seria salvar a imagem como string em base64 no seu banco de dados e renderizar a sequência usando :

<img src="<%= imageInBase64 %>">

Outra sugestão seria criar um servlet separado que retorne como resultado a imagem do banco de dados para o body da resposta:

InputStream input = resultSet.getBinaryStream("imageColumnName");
OutputStream output = response.getOutputStream();
response.setContentType("image/gif");

Abraço!

Olá Otávio Felipe. Muito obrigado mesmo pela ajuda. Quando se fala em imagens x servlet a maioria foge. Em outro forum, só faltaram me dizer que eu estava querendo derreter e disterreter a foto, rsrs No final das contas, por questão de tempo e performance, eu resolvi fazer como a maioria indicou. Salvar só o path no banco e a pasta no C:. Agora vou acrescentar isso no projeto. Se você algo que possa melhorar ai também, eu agradeço. Para listar ficou assim

jsp:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Teste</title>
</head>
<body>

        <img  src="/carregadorImagem?id=22" width="100" height="100"  />

</body>
</html>

servlet

package web;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.ProdutoDao;

@WebServlet("/carregadorImagem")
public class CarregadorImagem extends HttpServlet 
{
    private static final long serialVersionUID = 1L;
    private static FileInputStream fileInputStream;

    public CarregadorImagem() {
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException 
    {

        int id = Integer.parseInt(request.getParameter("id"));// vem do jsp

        ProdutoDao dao = new ProdutoDao();

        //camininho da imagem;
        byte[] imageData = carregarImagem(dao.recuperaImagem(id));

        response.setContentType("image/jpeg");
        response.getOutputStream().write(imageData);      
    }

    private static byte[] carregarImagem(String path) throws  IOException {

        byte[] image;
        File file = new File(path);//monta imagem baseada no path
        image = new byte[(int)file.length()]; 

        fileInputStream = new FileInputStream(file);
        fileInputStream.read(image);

        return image;
    }
}

dao

// Busca Imagem
       public String recuperaImagem(int id){

            String sql = "select imagem from Produtos where id=?";

            try (PreparedStatement stmt = connection.prepareStatement(sql)){ 
                stmt.setInt(1, id);
                ResultSet rs = stmt.executeQuery();
                if(rs.next()) {
                    return rs.getString("imagem");
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return null;

        }
}

Boa tarde, Aluízio! Como vai?

Só pra acrescentar uma informação, a estratégia de salvar o path no BD é a que é utilizada normalmente pois salvar a imagem em si no BD não é visto como boa prática.

Grande abraço e bons estudos.

Valeu pela força Gabriel Leite. Ótimo tópico que você mandou. Vai direto ao ponto e levanta os prós e os contras da coisa toda. No meu caso só tem tudo de ruim hehehe. Vou evitar essa forma ao máximo pois, realmente foi trabalhosa, e ainda deixa a aplicação pesada e com o código feio.

Por nada, Aluízio! Sempre que precisar tirar qualquer dúvida é só mandar aqui no fórum!

Grande abraço, bons estudos e sucesso!

Obrigado.