Inserir Imagem no Banco de dados JSP+MySql

Amigos,
queria que vocês me ajudassem a resolver meu probleminha, que é o seguinte… tenho que inserir no Banco de dados fotos que vem de um cadastro de imagens, estou usando Mysql, porém já tentei varias maneiras e ainda não conseguui… vi aqui no forum algumas opções porém não tive sucesso :frowning: … estou usando JSP… alguém pode me acompanhar nessa implementação? vale ressaltar que para esse caso não atende gravar somente a URL da imagem.

desde já agradeço todas as respostas.

Willian Baldez.

Amigos,
Ainda estou tentado resolver a questão de inserir imagem no banco de dados, vou postar aqui o ultimo código que fizpara realizar a inserção e visualização:

O código abaixo é a inserção da imagem no banco - aparentemente funciona,no banco o campo fica “System Bytes[]”


package dao;



import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileDescriptor;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.sql.Blob;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;



import javax.imageio.ImageIO;



import com.sun.imageio.plugins.jpeg.JPEG;



import model.Contato;



public class JDBCContatoDAO implements ContatoDAO {



	Connection conexao;



	public JDBCContatoDAO(Connection conexao) {

		this.conexao = conexao;

	}



	public void inserir(Contato contato) throws FileNotFoundException {



		String comando = "Insert into contato (nome, telefone, celular, dataNascimento, endereco, cidade, estado, imagem)"

				+ " values (?,?,?,?,?,?,?,?)"; 


		File arquivo = new File(

				"C:/Users/WILLIANBALDEZ.AP/Documents/Desenvolvimento/Agenda/WebContent/Public/FOTO.jpg");



		PreparedStatement p;

		try {

			FileInputStream inputStream = new FileInputStream(arquivo);

			p = this.conexao.prepareStatement(comando);

			p.setString(1, contato.getNome());

			p.setString(2, contato.getTelefone());

			p.setString(3, contato.getCelular());

			p.setDate(4, new java.sql.Date(contato.getDataNascimento()

					.getTime()));

			p.setString(5, contato.getEndereco());

			p.setString(6, contato.getCidade());

			p.setString(7, contato.getEstado());

			p.setBinaryStream(8, inputStream, (int) arquivo.length());

			p.executeUpdate();

		} catch (SQLException e) {

			e.printStackTrace();

		}

	}

Abaixo o método que lista os contatos - ele fica na mesma classe acima.


	public List<Contato> listarTodos() {

		List<Contato> contatos = new ArrayList<Contato>();

		String comando = "select * from contato";

		try {

			Statement stmt = conexao.createStatement();

			ResultSet rs = stmt.executeQuery(comando);



			while (rs.next()) {

				Contato contato = new Contato();



				int codigo = rs.getInt("idContato");

				String nome = rs.getString("nome");

				String telefone = rs.getString("telefone");

				String celular = rs.getString("celular");

				Date nascimento = rs.getDate("dataNascimento");

				String endereco = rs.getString("endereco");

				String cidade = rs.getString("cidade");

				String estado = rs.getString("estado");


				byte[] imgBytes = rs.getBytes("imagem");

				File testei = new File("teste.jpg");

				FileOutputStream fos = new FileOutputStream(testei);

				fos.write(imgBytes);

				FileDescriptor fd = fos.getFD();

				
                                   fd.sync();



				contato.setCodigo(codigo);

				contato.setNome(nome);

				contato.setTelefone(telefone);

				contato.setCelular(celular);

				contato.setDataNascimento(nascimento);

				contato.setEndereco(endereco);

				contato.setCidade(cidade);

				contato.setEstado(estado);

				contato.setImagem(fd);

                                //contato.setImagem(imgBytes);
                                //contato.setImagem(fos);
                                //contato.setImagem(testei);



				contatos.add(contato);



			}



		} catch (Exception e) {

			e.printStackTrace();

		}

		return contatos;



	}

Abaixo é minha JSP - onde a imagem deverá aparecer.


<%@page import="java.awt.image.BufferedImage"%>

<%@page import="javax.imageio.ImageIO"%>

<%@page import="java.io.InputStream"%>

<%@page import="java.text.SimpleDateFormat"%>

<%@page import="model.Contato"%>

<%@page import="java.util.List"%>

<%@page import="dao.JDBCContatoDAO"%>

<%@page import="java.sql.Connection"%>

<%@page import="dao.FabricaConexao"%>

<%@ 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=utf-8" /> 

<title>Agenda Telefonica</title>

<meta name="keywords" content="" />

<meta name="description" content="" />

</head>

<body>

<%

//Conexão com o Banco de dados

FabricaConexao fabrica = new FabricaConexao();

Connection conexao = fabrica.fazConexao();

JDBCContatoDAO dao = new JDBCContatoDAO(conexao);

//fim

//lista com todos os contatos

List<Contato> contatos = dao.listarTodos();

//Fecha conexão com o banco de dados

fabrica.fecharConexao();

%>

		<table border="1">		

			<tr>

				<th>Código</th>

				<th>Nome</th>

				<th>Telefone</th>

				<th>Celular</th>

				<th>Data de nascimento</th>

				<th>Endereço</th>

				<th>Cidade</th>

				<th>Estado</th>

				<th>Imagem</th>												

			</tr>			

					<% for(Contato c : contatos){	

					String sData = new SimpleDateFormat("dd/MM/yyyy").format(c.getDataNascimento());

					%>

				<tr>

					<td><%=c.getCodigo()%></td>

					<td><%=c.getNome()%></td>

					<td><%=c.getTelefone()%></td>

					<td><%=c.getCelular()%></td>

					<td><%=sData%></td>

					<td><%=c.getEndereco()%></td>

					<td><%=c.getCidade()%></td>

					<td><%=c.getEstado()%></td>					

					<td><img <%=c.getImagem()%>/></td>

					<td><%=c.getImagem()%></td>

																			      				 				

				</tr>

									

		<% } %>				

		</table>		

		<table border="1" width="500" height="500">		

		    <tr>

		    	<td>		    		

		    		<img src="images/FOTO.jpg"/>

		    	</td>

		    </tr>

		 </table>			

		     				

		<br />

		<br />

		

		<form action="index.jsp">

				<input width ="300" type="submit" value="Voltar ao Inicio">

			</form>

</body>

</html>

obrigado,

Willian Baldez.

Amigos,
Consegui inserir e visualizar as imagens no banco de dados MySql, porém estou com outra duvida, primeiro vou postar o que fiz para resolver, caso alguém passe pela mesma situação:

Abaixo a inserção:

String comando = "Insert into contato (nome, telefone, celular, dataNascimento, endereco, cidade, estado, imagem)"
				+ " values (?,?,?,?,?,?,?,?)";

		
		File arquivo = new File("G:/LOGO.png");
		FileInputStream inputStream = new FileInputStream(arquivo);
		PreparedStatement p;
		try {								
			p = this.conexao.prepareStatement(comando);			
			p.setString(1, contato.getNome());
			p.setString(2, contato.getTelefone());
			p.setString(3, contato.getCelular());
			// Tratando java.util.date para java.sql.date, pois o statement só
			// aceita SQL
			p.setDate(4, new java.sql.Date(contato.getDataNascimento()
					.getTime()));
			p.setString(5, contato.getEndereco());
			p.setString(6, contato.getCidade());
			p.setString(7, contato.getEstado());
			p.setBinaryStream(8, inputStream, (int) arquivo.length());
			p.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

abaixo a conversão

public class JPGManager {
	static public void encodeJPG(OutputStream out, byte [] image) throws IOException{
		InputStream fs = new ByteArrayInputStream(image);
		JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(fs);
		BufferedImage bImage = decoder.decodeAsBufferedImage();
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(bImage);
		fs.close();
		fs = null;
		encoder = null;
		bImage = null;
		}

}

agora sim… a visualização, o pulo do gato foi criar uma servlet somente para visualizar a imagem?

<%@page import="action.JPGManager"%>
<%@page import="java.sql.Blob"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="dao.FabricaConexao"%>
<%@ page language="java" import="java.lang.*" %>

<%
try {
	// criando a conexao com o banco de dados
	FabricaConexao fabrica = new FabricaConexao();
	Connection conexao = fabrica.fazConexao();
	Statement stm = conexao.createStatement();
	int codigo;
	// pegando o codigo da foto a ser exibida
	if (request.getParameter("numero") == null)
	codigo = 1;
	else
		codigo = Integer.parseInt(request.getParameter("numero"));
		// procurando pela foto na tabela
		ResultSet rs = stm.executeQuery("SELECT * FROM contato WHERE idContato = "+codigo);
			if (rs.next()) {
			// pegando o conteudo do campo foto (BLOB, binario)
			Blob blob = rs.getBlob("imagem");
			// Codificando para JPG e enviando para o browser, através do Output do servlet
			JPGManager.encodeJPG(response.getOutputStream(), blob.getBytes(1, (int)
		blob.length()) );
			}			
	}catch (Exception e){
				// erro
				%>Erro encontrado<%
				}
%>

esse link me auxiliou na maior parte: http://www.xtibia.com/forum/topic/52851-upload-de-imagens-para-banco-de-dados/

Agora vem minha duvida, logo no primeiro código que postei vocês podem observar que coloquei o caminho da imagem manual

File arquivo = new File("G:/LOGO.png");
		FileInputStream inputStream = new FileInputStream(arquivo);

o meu problema está ai… tenho que fazer com que eu escolha a imagem pelo browser e não direto na fonte… abaixo o formulario que insiro os dados:

<%@page import="model.Contato"%>
<%@ 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>Agenda de Contatos</title>
</head>
<body>
<form action="InserirContato" method="post">
		Nome: <input type="text" name="nome"><br />
		Telefone: <input type="text" name="telefone"><br />
		Celular: <input	type="text" name="celular"><br />
		Nascimento: <input type="text" name="nascimento"><br />
		Endereço: <input type="text" name="endereco"><br />
		Cidade: <input type="text" name="cidade"><br />
		Estado: <input type="text" name="estado"><br />		
		<input type="file" name="foto"> <br />
		<br />
		<input  type="submit" value="Salvar" >				
	</form>
	<br />
	<br />	
	<form action="index.jsp">
		<input width ="300" type="submit" value="Cancelar">
	</form>
	

</body>
</html>

Agradeço a todos que puderem me auxiliar.

Willian Baldez

Oi parceiro,

Só não esqueça de detalhar como e que vc utilizou para chegar ao resultado e colobar [RESOLVIDO] no titulo do tópico

att.

ok hvivox, vou detalhar melhor meus post’ss… agora em relação ao [RESOLVIDO] ainda não consegui resolver meu problema… você pode me ajudar?

Willian Baldez