Upload de Imagens ou Salvar Imagem no MySQL

22/03/2011

0

Olá Pessoal,
estou com um problema aqui e não idéia de como resolver, se alguém souber de algum tutorial ou me orientar no assunto ficarei muito grato, é o seguinte:
Preciso salvar 3 fotos que o usuário irá escolher quais serão, se vou salvar elas no banco ou fazer upload delas tanto faz, mas preciso de algum jeito salvar essas fotos(no BD ou fazer upload e salvar o caminho delas no BD) e depois mostra-las na tela, tudo isso via JSP. 
 

Pelo que andei lendo por ai, fazer upload das fotos e salvar no BD o caminho é a melhor escolha, porém não sei fazer upload de fotos para o servidor.
Toda ajuda que vier será bem vinda, agradeço pela atenção.
Felipe Scherer

Felipe Scherer

Responder

Posts

22/03/2011

Robson Teixeira

Ola Felipe
  para fazer o que deseja que é guardar fotos no BD procure sobre BLOB com isso você será capaz de guardar suas imagens em binario e para mostra-las na pagina o codigo abaixo deve ajuda-lo

response.setContentType("image/jpeg");
                        response.setHeader("Content-disposition", "attachment;filename=imagem"+id+"");
                        response.getOutputStream().write(obj.getImagem());
                        response.getCharacterEncoding();

o id é 1 contador para que o nome em filename não se repita.

Não esquecendo de pesquisar sobre BLOB ok??.

espero ter ajudado.

att
 robson Passarella
Responder

23/03/2011

Davi Costa

Para a outra opção, vc cria uma pasta dentro de web-content (por exemplo: imagens) e salva nela a figura, no banco vc salva o caminho da imagem.
Na hora de renderizar vc busca do banco esse caminho e joga na sua jsp.
Se tiver usando algum framework tipo struts ou jsf... vai ficar mais simples ainda

Att Davi
Responder

23/03/2011

Felipe Scherer

Olá Robson,
andei lendo sobre BLOB e tudo mais e mechendo cons códigos só está gerando uma Exception, vo postar os códigos e o log do apache pra ver se alguém sabe como resolvo isso;
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>
}

log do APACHE
urlImagemmmmm = DSC02842.JPGjavax.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)

 
Responder

23/03/2011

Davi Costa

Faça o seguinte teste antes de salvar a imagem:

public void gravarImagem( String urlImagem ) throws Exception   {      System.out.println("urlImagemmmmm = " + urlImagem);      File file = new File( urlImagem );
      if(file.exist()){
          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();
      }else{
         //lançar alguma mensagem para o usuário
      }


   }

Responder

23/03/2011

Davi Costa

Só complementando para o servidor encontrar o arquivo, vc vai ter que passar o caminho completo.
Por exemplo a String urlImagem deveria ter algo como:
C:\arquivo.JPG

Mas tem tags jsp, ou html que vc escolhe o arquivo sem ser passando a String, talvez vc até esteja fazendo assim e vc já pega o array de bytes. Dá uma pesquisada nisso.


Mas sem querer te deixar triste, pois já se adiantou muito na implementação... é uma péssiama prática salvar o arquivo no banco.. teria que ser um requisito bem específico, o ideal era salvar esse arquivo e salvar só sua String..

Att Davi

Responder

23/03/2011

Felipe Scherer

Fiz a alteração e deu o seguinte a seguinte msg:
urlImagemmmmm = DSC02840.JPGIMAGEM NÃO GRAVADA

public void gravarImagem( String urlImagem ) throws Exception   {
      System.out.println("urlImagemmmmm = " + urlImagem);      File file = new File( urlImagem );      if(file.exists()){          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();          System.out.println( "Imagem gravada!" );      }else{         System.out.println("IMAGEM NÃO GRAVADA");      }

   }
Responder

23/03/2011

Davi Costa

É o que te falei o servidor não consegue achar esse arquivo, ele precisa do caminho inteiro.
Esse:
urlImagemmmmm = DSC02840.JPG
O servidor nunca vai encontrar ele precisa do caminho completo, por exemplo:
C:\DSC02840.JPG

Att Davi
Responder

23/03/2011

Felipe Scherer

Davi,
é isso ai mesmo, o servidor não consegue achar o arquivo, vou da uma pesquisada agora como passar o path completo para ele.Por enquanto vou ficar com isso aqui mesmo, pois não serão muitas imagens que serão salvas no banco, mas futuramente pretendo aprender a fazer upload das imagens e salvar o caminho delas no banco.
Muito obrigado mesmo pela ajuda.
Responder

23/03/2011

Davi Costa

Tranquilo cara, precisando conte sempre com a gente, dê uma pesquisada tb em frameworks como jsf ou struts.
Podem te ajudar bastante.


Att Davi

Responder

23/03/2011

Robson Teixeira

Olá Felipe
 no form da sua JSP você esqueceu e adicionar o seguinte parametro na tag form enctype="multipart/form-data"

e ficaria assim <form name="form1" action="http://localhost:8084/GD_Rural/TesteServlet" method="post" enctype="multipart/form-data">

com isso o codigo que você postou para recuperar o arquivo deve funcionar.

e se quiser usar Struts use o Struts2 pois ele ja faz o tratamento de arquivos usando o apache commos-upload se não me engano.

qualquer coisa e so chamar

att
 robson Passarella
Responder

23/03/2011

Felipe Scherer

Cá estou novamente com outra probleminha, andei pesquisando mas não achei nada,
como faço pra pegar o caminho completo da imagem, pq quando eu carrego a imagem na variavel "urlImagem" fica salvo apenas o nome da imagem no meu caso "foto.jpg" e não o caminho "d:\foto.jpg".
Alguém sabe como pegar o caminho completo da imagem?

Responder

23/03/2011

Davi Costa

Um a solução seria criar um campo oculto e atribuir um ID para o input do arquivo e, na chamada do botão, submeter o formulário por uma chamada JavaScript.
Ex:

<form action="teste.jsp" method="post" name="form1"> 
           <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> 
        
       -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
       FUNÇÃO JAVASCRIPT: 
        
       function submeteForm1(){ 
       var campo_oculto = document.getElementById("oculto"); 
       var campo_file = document.getElementById("arquivo"); 
       campo_oculto.value = campo_file.value; 
       documento.form1.submit(); 
       }


Veja também:

http://pt.w3support.net/index.php?db=so&id=423376

Att Davi
Responder

23/03/2011

Felipe Scherer


  coloquei o códio que vc postou
<%--     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 submeteForm1(){       var campo_oculto = document.getElementById("oculto");       var campo_file = document.getElementById("arquivo");       campo_oculto.value = campo_file.value;       alert (campo_file);       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>

no servlet coloquei assim
String urlImagem = request.getParameter("hidden_file");gravarImagem( urlImagem );

e deu isso:
urlImagemmmmm = C:\fakepath\foto.jpgIMAGEM NÃO GRAVADA
o que pode ser?
Responder

23/03/2011

Davi Costa

Cara, realmente temos que analisar com calma, pq a priori ele deveria funcionar.
Primeira coisa a fazer é pegar esse caminho e verificar se está correto:
Pega só o C:\fakepath\.. e coloca em uma pasta p ver se existe... sem o arquivo.. e dpois verifica se está realmente lá.....
E nessa linha de código adiciona a seguinte instrução logo abaixo dessa linha:



System.out.println("IMAGEM NÃO GRAVADA");
System.out.println(file.getPath()+" '+file.getName());



Att Davi
Responder

23/03/2011

Felipe Scherer

verifiquei, essa pasta nao existe
e coloquei a linha de código;ystem.out.println(file.getPath()+" "+file.getName());
e o resultado foi:urlImagemmmmm = C:\fakepath\DSC02840.JPGIMAGEM NÃO GRAVADAC:\fakepath\DSC02840.JPG DSC02840.JPG

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar