Salvar imagens no MySQL

Olá Pessoal,

Estou desenvolvendo um sistema web em JSP, e nesse sistema o usuario precisar inserir 3 fotos, então o que quero fazer é salvar as fotos no MySQL e depois exibi-las na tela. Alguém pode me dar uma luz de como salvar as imagens no MySQL e depois exibi-las no browser?

Desde ja agradeço pela atenção.

e se vc somente salvar as fotos em um diretório específico e na base salvar somente a URL das fotos…

é uma boa opção tbm, mas como faço isso?

Vc poderia criar uma maneira de gravar os bytes da foto onde ao gravar a imagem vc converte para um Array de bytes e envia esses dados para o BD.
E ao recuperar os dados na tela apresenta a imagem

byte[] imagemBuffer = (byte[]) request.getSession(true).getAttribute("ImagemCliente");
response.getOutputStream().write(imagemBuffer); 

Flw

poderia comentar o que cada linha de código dessas pra mim saber o que cada uma faz?

e pra salvar em uma pasta no servidor e só salvar o caminho no banco alguem saberia me dizer como fazer?

Vc está fazendo uso de algum framework no controle da sua aplicação? Como JSF, Spring ,VRaptor

não to não cara, sou iniciante no JSP, não sei muita coisa ainda e não faço ideia de como fazer isso, preciso de toda a juda que for possivel.

Tudo bom?

Abaixo encontra-se um exemplo, veja se te ajuda:

A tabela:

CREATE TABLE tb_imagens
(
    codigo INT NOT NULL AUTO_INCREMENT,
    imagem BLOB NOT NULL,
    PRIMARY KEY(codigo)
);

index.jsp:

<html>
  <head>
    <script type="text/javascript">
      function alterarImagem() 
      {
          document.form1.img.src = document.form1.imagem.value;   
      }
    </script>
  </head>
<body>  
   <form name="form1" action="/NomeProjeto/TesteServlet" method="post">  
      <img name="img" src=""/>
      <input type="file" name="imagem" onchange="alterarImagem()"/>  
      <input type="submit" name="bt" value="Salvar"/>  
   </form>  
</body> 
</html>

Outra maneira de recuperar imagem do banco e exibir.
Busca pela imagem no qual o código do registro é 1:

index.jsp

...
<body>
   <img src="/NomeProjeto/TesteServlet?comando=1"/> <%-- chama o método doGet --%>
</body>
...

TesteServlet.java(OBS.: Criar a classe Conexao contendo o método ‘static getConexao()’ ):

// Importar aqui todas as classes necessárias

public class TesteServlet extends HttpServlet
{

   // ENCAMINHA PARA GRAVAR
   protected void doPost( HttpServletRequest request, HttpServletResponse response )
   {
       try
       {
            String urlImagem = request.getParameter( "imagem" );
            gravarImagem( urlImagem );
            System.out.println( "Imagem gravada!" );
       }
       catch( Exception e ){ e.printStackTrace(); }
       
   }

   // ENCAMINHA PARA EXIBIR NA SEGUNDA PÁGINA 'index.jsp' 
   protected void doGet( HttpServletRequest request, HttpServletResponse response )
   {
       try
       {
            Integer codigo = Integer.parseInt( request.getParameter( "comando" ) );
            ServletOutputStream sos = response.getOutputStream();
            sos.write( buscarImagem( codigo ) );
       }
       catch( Exception e ){ e.printStackTrace(); }
       
   }


   public void gravarImagem( String urlImagem ) throws Exception  
   {  
      File file = new File( urlImagem );  
      BufferedImage img = ImageIO.read( file );  
              
      ByteArrayOutputStream b = new ByteArrayOutputStream();  
      ImageIO.write( img, "jpg", b );  
  
      byte[] imgArray = b.toByteArray();  
  
        
      String sql = "INSERT INTO tb_imagens VALUES( NULL, ? )";  
      PreparedStatement stm = Conexao.getConexao().prepareStatement(sql);  
      stm.setBytes( 1, imgArray );  
      stm.executeUpdate();  
      stm.close();  
  
  
   }  
  
   public byte[] buscarImagem( Integer codigo ) throws Exception  
   {  
      String sql = "SELECT * FROM tb_imagens WHERE codigo=?";  
      PreparedStatement stm = Conexao.getConexao().prepareStatement(sql);  
      stm.setInt( 1, codigo );  
        
      ResultSet rs = stm.executeQuery();  
      if( !rs.next() )       
         throw new RuntimeException( "Registro não encontrado." );  
      else  
      {  
           
         InputStream input = rs.getBinaryStream("imagem");  
         BufferedImage buffer = ImageIO.read(input);  
         ByteArrayOutputStream b = new ByteArrayOutputStream();  
         ImageIO.write(buffer,"jpg", b);  
  
         byte[] imgArray = b.toByteArray();           
         return imgArray;  
      }  
        
   }
}    

Olá amigo,

peguei o código que vc postou, criei a tabela no MySQL e tentei usar para salvar a imagem no banco, mas quando eu clico em “salvar”, nada acontece, da uma olhada no código, ve se tem algo de errado e da uma olhada na classe ConnectionFactory.java pra ver se o modo como fiz conexão está correto :

index.jsp

<%-- 
    Document   : TESTE2
    Created on : 18/03/2011, 09:28:45
    Author     : Felipe
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <script type="text/javascript">
      function alterarImagem()
      {
          document.form1.img.src = document.form1.imagem.value;
      }
    </script>
  </head>
<body>
   <form name="form1" action="/GD_Rural/TesteServlet" method="post">
      <img name="img" src=""/>
      <input type="file" name="imagem" onchange="alterarImagem()"/>
      <input type="submit" name="bt" value="Salvar"/>
   </form>
</body>
</html>

TesteServlet.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.sistema.entidades;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sistema.banco.ConnectionFactory;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.sql.*;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.SQLException;

/**
 *
 * @author Felipe
 */
// Importar aqui todas as classes necessárias

public class TesteServlet extends HttpServlet
{



   // ENCAMINHA PARA GRAVAR
   protected void doPost( HttpServletRequest request, HttpServletResponse response )
   {
       try
       {
            String urlImagem = request.getParameter( "imagem" );
            gravarImagem( urlImagem );
            System.out.println( "Imagem gravada!" );
       }
       catch( Exception e ){ e.printStackTrace(); }

   }

   // ENCAMINHA PARA EXIBIR NA SEGUNDA PÁGINA 'index.jsp'
   protected void doGet( HttpServletRequest request, HttpServletResponse response )
   {
       try
       {
            Integer codigo = Integer.parseInt( request.getParameter( "comando" ) );
            ServletOutputStream sos = response.getOutputStream();
            sos.write( buscarImagem( codigo ) );
       }
       catch( Exception e ){ e.printStackTrace(); }

   }


   public void gravarImagem( String urlImagem ) throws Exception
   {
      File file = new File( urlImagem );
      BufferedImage img = ImageIO.read( file );
      Connection con = ConnectionFactory.getConexao();

      ByteArrayOutputStream b = new ByteArrayOutputStream();
      ImageIO.write( img, "jpg", b );

      byte[] imgArray = b.toByteArray();


      String sql = "INSERT INTO tb_imagens VALUES( NULL, ? )";
      PreparedStatement stm = con.prepareStatement(sql);
      stm.setBytes( 1, imgArray );
      stm.executeUpdate();
      stm.close();


   }

   public byte[] buscarImagem( Integer codigo ) throws Exception
   {
      Connection con = ConnectionFactory.getConexao();
      String sql = "SELECT * FROM tb_imagens WHERE codigo=?";
      PreparedStatement stm = con.prepareStatement(sql);
      stm.setInt( 1, codigo );

      ResultSet rs = stm.executeQuery();
      if( !rs.next() )
         throw new RuntimeException( "Registro não encontrado." );
      else
      {

         InputStream input = rs.getBinaryStream("imagem");
         BufferedImage buffer = ImageIO.read(input);
         ByteArrayOutputStream b = new ByteArrayOutputStream();
         ImageIO.write(buffer,"jpg", b);

         byte[] imgArray = b.toByteArray();
         return imgArray;
      }

   }
}

ConnectionFactory.java


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.sistema.banco;

/**
 *
 * @author Felipe
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
    public static Connection getConexao() throws SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Conectado!");
            return DriverManager.getConnection("jdbc:mysql://localhost:3306/gd_rural","root","admin");

            } catch (ClassNotFoundException e) {
             throw new SQLException(e.getMessage());
        }
    }

}  
<form name="form1" action="/GD_Rural/TesteServlet" method="post">

É preciso mapear o servlet TesteServlet.java.

Isso é feito no web.xml:
Acrescente isto:

<servlet>
   <servlet-name>TesteServlet</servlet-name>
   <servlet-class>com.sistema.entidades.TesteServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>TesteServlet</servlet-name>
   <url-pattern>/TesteServlet</url-pattern>
</servlet-mapping>

Se já tiver configura, tente mudar a url, assim:

<form name="form1" action="http://localhost:8080/GD_Rural/TesteServlet" method="post">

No caso da porta do servidor, for 8080.

Verifique também se o nome do projeto é esse mesmo.

Obs.: Execute o projeto pelo eclipse.

Faaala felipe_eng,

cara reveja esta questão de armazenar as imagens em banco de dados, tem-se que ter cuidados com isto pois pode inchar o banco e torná-lo muito lento a opção menos agressiva é armazenar os dados da imagem ao invés de armazenar a imagem em si, utilizando o tipo Blob, se o banco não for ter muitos registro é tranquilo mas se tiver muitos registros pode ser um problema, dê uma pesquisada no google sobre o tipo Blob.

Vlwz

só criar um campo com o diretório específico do servidor onde ficará armazenado a imagen e um nome para a imagem. quando for salvar a imagem, faz um upload da mesma no servidor, e salva diretório e nome dela no BD.
Fica bem mais tranquilo.

Concordo com a solução proposta pelo amigo acima.

Realmente e necessário que essas imagens sejam salvar no banco ?

Oi, eu tambem estou começando a fazer aplicações das imagens nas paginas html com as servlets e jsp,
e gostaria de saber como fazer para gravar as imagens em um diretório do servidor.
Se puderem me indiquem um link. Obrigado.

Fala pessoal,

não nescessáriamente precisa ser salva no banco nao, se vou salvar elas no banco ou salva-las em algum diretório do servidor tanto faz, espero fazer da melhor maneira, mas preciso de algum jeito salvar essas fotos e depois mostra-las na tela, tudo isso via JSP.

Sinceramente acho melhor a ideia de fazer o upload das fotos para o servidor e só salvar a url dela, mas também não sei fazer upload das fotos para o servidor.

Ola Galera mais um iniciante com problemas de arqmazenar imagens!
Utilizando o richfaces e salvando a imagem em diretorio e gravando apenas o caminho no BD(string), esse post resolve:
http://www.guj.com.br/java/121937-fileupload-richfaces

Porem uma duvida, quando salvo em um diretório no servidor dentro do projeto, ao reconstruir meu projeto, todas as fotos serão detonadas, até aí ok.
Criamos uma pasta fora do projeto, mas para a imagem ser listada precisa recompilar, qual seria a maneira correta? Como salvar as imagens desse diretorio ao fazer um deploy na produção por exemplo?

Acredito que salvar no BD não sejam uma solução muito plausível, levando em consideração um grande volume de imagens!

Agradeço a todas as explicações anteriores, consegui bons resultados!

alguem consegui fazer upload com o link acima?

se alguem tiver um tutorial de como fazer upload, postem ai por favor, pois estou apanhando mt e nao consigo fazer de jeito nenhum.

vlw a todos

andei mechendo em alguns códigos aqui e ta gerando a seguinte Exception:

avax.imageio.IIOException: Can’t read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at TesteServlet.gravarImagem(TesteServlet.java:88)
at TesteServlet.doPost(TesteServlet.java:76)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

os códigos são:

TESTE2.jsp

<%-- 
    Document   : TESTE2
    Created on : 18/03/2011, 09:28:45
    Author     : Felipe
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <script type="text/javascript">
      function alterarImagem()
      {
          document.form1.img.src = document.form1.imagem.value;
      }
    </script>
  </head>

<body>
   <form name="form1" action="http://localhost:8084/GD_Rural/TesteServlet" method="post">
      <img name="img" src=""/>
      <input type="file" name="imagem" onchange="alterarImagem()"/>
      <input type="submit" name="bt" value="Salvar"/>
   </form>
</body>
</html>

TesteServlet.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sistema.banco.ConnectionFactory;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.sql.*;
import javax.imageio.*;
import javax.servlet.ServletOutputStream;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.SQLException;

/**
 *
 * @author Felipe
 */
public class TesteServlet extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet TesteServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet TesteServlet at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");

        } finally {
            out.close();
        }
    }


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



    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
          try
       {
            String urlImagem = request.getParameter( "imagem" );
            
            gravarImagem( urlImagem );  
            System.out.println( "Imagem gravada!" );
       }
       catch( Exception e ){ e.printStackTrace(); }


    }

public void gravarImagem( String urlImagem ) throws Exception
   {
      System.out.println("urlImagemmmmm = " + urlImagem);
      File file = new File( urlImagem );
      BufferedImage img = ImageIO.read( file );

      ByteArrayOutputStream b = new ByteArrayOutputStream();
      ImageIO.write( img, "jpg", b );

      byte[] imgArray = b.toByteArray();


      String sql = "INSERT INTO tb_imagens VALUES( NULL, ? )";
      PreparedStatement stm = ConnectionFactory.getConexao().prepareStatement(sql);
      stm.setBytes( 1, imgArray );
      stm.executeUpdate();
      stm.close();


   }



    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

alguém sabe o motivo de estar gerando essa Exception?

Descobri o problema da exception, ela acontece pq não acha o caminho da imagem. Ele precisa do caminho completo da imagem por exemplo c:\foto.jpg e estou tentando pegar o caminho completo com o seguinte código:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <script type="text/javascript">
      function submeteForm1(){
       var campo_oculto = document.getElementById("oculto");
       var campo_file = document.getElementById("arquivo");
       campo_oculto.value = campo_file.value;
       document.form1.submit();
       }
    </script>
  </head>

<body>
   <form name="form1" action="http://localhost:8084/GD_Rural/TesteServlet" method="post">
      <input name="hidden_file" id="oculto" type="hidden"/>
         <p>
           <input id="arquivo" name="file" type="file" size="100" maxlength="100"/>
         </p>
         <p>
           <input name="id" type="text" id="id"/>
           </p>
           <p> </p>
         <p>
            <input type="button" name="Submit" value="Enviar" onclick="submeteForm1()">
          </p>
   </form>
</body>
</html>

porém não estou conseguindo, e acontece o seguinte quando executo a aplicação:

urlImagemmmmm = C:\fakepath\DSC02840.JPG
IMAGEM NÃO GRAVADA
C:\fakepath\DSC02840.JPG