Java x PostgreSQL x Imagens (Armazenamento, recuperação e exibição)

3 respostas
J

Bom dia,

Pesquisei por diversos lugares inclusive aqui, em uma solução para um problema que estou enfrentando.
Não sou exatamente “experiente” no desenvolvimento Web, mas tento alguma coisa. :slight_smile:

Tenho uma aplicação em JSP, com um banco Postgres, onde além de outras coisas pretendo armazenar imagens no banco e recuperá-las. Como estou fora da área, não tendo estudado coisas como JSF, Hibernate, etc…, mas uso Ajax (DWR) na aplicação.

O meu código, a princípio, funciona bem, com esse abaixo eu insiro a imagem:

boolean isMultipart = FileUpload.isMultipartContent(request);
    try {
       if (isMultipart) {  
         DiskFileUpload upload = new DiskFileUpload();
         upload.setSizeMax(10*1024*1024);  
         upload.setRepositoryPath("d:/Musica");

         List items = upload.parseRequest(request);         
         InputStream is;
         
         String query = "insert into imagem (imagem2) values (?)";
         PreparedStatement stmt = ConnectionFactory.getConnection().prepareStatement(query);         
         
         Iterator it = items.iterator();  
         while (it.hasNext()) {  
            FileItem fitem = (FileItem) it.next();  
            if (!fitem.isFormField()) {  
            	is = fitem.getInputStream();
         		stmt.setBinaryStream(1, is, (int)fitem.getSize());
         		stmt.execute(); 
            }
         }
      }

E com esse eu recupero:

PreparedStatement ps = ConnectionFactory.getConnection().prepareStatement("SELECT imagem2 " +  
	                                              "FROM imagem " +  
	                                              "WHERE id = 1");  
	   
	 ResultSet rs = ps.executeQuery();  
	 if (rs != null) {  
	    while (rs.next()) {  
	       byte[] imgBytes = rs.getBytes(1);
	       System.out.println("Tamanho da imagem: " + imgBytes.length);
	       out.println(imgBytes);	       
	    }  
	    rs.close();  
	 }

Entretanto, gostaria de recuperar a imagem e mostrá-la em no navegador.
Agradeço qualquer informação.

Ps. Não encontrei esta informação no fórum, se o tópico for duplicado, inconveniente ou fora da seção, desculpe-me e por favor me informe.
Atenciosamente, James

3 Respostas

lenando

Dá uma olhada nesse tópico http://www.guj.com.br/posts/list/52931.java

Espero que ajude.

Até mais.
Fernando.

J

Fernando,

Obrigado pela ajuda, acho que agora vai.
Vou levar meu filhote ao médico e depois vou tentar, um abraço.

James

J

Boa noite, pessoal, postando para agradecer e dizer que a aplicação teste funcionou beleza!

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<form name="form1" method="post">  
 		<table width="750" border="1">  
   			<tr> 
     			<td>Foto:</td>
     			<td><img name="img1" src="RecuperaImagem"></td>  
   			</tr>  
		</table>  
	</form>  
</body>  
</html>

web.xml (Acrescentado)

<servlet>
		<display-name>RecuperaImagem</display-name>
		<servlet-name>RecuperaImagem</servlet-name>
		<servlet-class>RecuperaImagem</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>RecuperaImagem</servlet-name>
		<url-pattern>/RecuperaImagem</url-pattern>
	</servlet-mapping>

RecuperaImagem.java

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/jpeg");  
		ServletOutputStream out = response.getOutputStream();   
		Foto foto = new Foto();
	       
	     int tamanho = 1;  
	     byte[] buffer = new byte[1024*tamanho];  
	     InputStream is = foto.recuperaFoto();  
	     int bytesread = 0;  
	     while((bytesread = is.read(buffer))!=-1){  
	         out.write(buffer,0,bytesread);  
	     }  
	     out.flush();  
	     out.close();  
	     is.close();  
	     System.out.println("Passou por aqui SERVICE!");

	}

Foto.java

package upload;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Foto {
	
	public InputStream recuperaFoto() {
		
		 String sql = "SELECT imagem2 FROM imagem WHERE id = ?";
		     Connection con = null;  
		     PreparedStatement pst = null;  
		     ResultSet rs = null;  
		     InputStream in = null;  
		       
		     try {  
		         con = ConnectionFactory.getConnection();  
		         pst = con.prepareStatement(sql);  
		         pst.setLong(1, 2);  
		         rs = pst.executeQuery();  
		           
		         while(rs.next()){  
		        	 in = rs.getBinaryStream("imagem2");
		         }  
		     } catch (Exception e) {  
		         e.printStackTrace();  
		     } finally {  
		         try{rs.close();}catch(Exception e){}  
		         try{pst.close();}catch(Exception e){}  
		         try{con.close();}catch(Exception e){}  
		     }  
		     return in;  
		 }  		
}

Muito obrigado pela atenção e agora é términar o último módulo da aplicação.
[]s, James

Criado 27 de maio de 2009
Ultima resposta 27 de mai. de 2009
Respostas 3
Participantes 2