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?
e se vc somente salvar as fotos em um diretório específico e na base salvar somente a URL das fotos…
F
felipe_eng
é uma boa opção tbm, mas como faço isso?
Master.Abs
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
TesteServlet.java(OBS.: Criar a classe Conexao contendo o método ‘static getConexao()’ ):
// Importar aqui todas as classes necessáriaspublicclassTesteServletextendsHttpServlet{// ENCAMINHA PARA GRAVARprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse){try{StringurlImagem=request.getParameter("imagem");gravarImagem(urlImagem);System.out.println("Imagem gravada!");}catch(Exceptione){e.printStackTrace();}}// ENCAMINHA PARA EXIBIR NA SEGUNDA PÁGINA 'index.jsp' protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse){try{Integercodigo=Integer.parseInt(request.getParameter("comando"));ServletOutputStreamsos=response.getOutputStream();sos.write(buscarImagem(codigo));}catch(Exceptione){e.printStackTrace();}}publicvoidgravarImagem(StringurlImagem)throwsException{Filefile=newFile(urlImagem);BufferedImageimg=ImageIO.read(file);ByteArrayOutputStreamb=newByteArrayOutputStream();ImageIO.write(img,"jpg",b);byte[]imgArray=b.toByteArray();Stringsql="INSERT INTO tb_imagens VALUES( NULL, ? )";PreparedStatementstm=Conexao.getConexao().prepareStatement(sql);stm.setBytes(1,imgArray);stm.executeUpdate();stm.close();}publicbyte[]buscarImagem(Integercodigo)throwsException{Stringsql="SELECT * FROM tb_imagens WHERE codigo=?";PreparedStatementstm=Conexao.getConexao().prepareStatement(sql);stm.setInt(1,codigo);ResultSetrs=stm.executeQuery();if(!rs.next())thrownewRuntimeException("Registro não encontrado.");else{InputStreaminput=rs.getBinaryStream("imagem");BufferedImagebuffer=ImageIO.read(input);ByteArrayOutputStreamb=newByteArrayOutputStream();ImageIO.write(buffer,"jpg",b);byte[]imgArray=b.toByteArray();returnimgArray;}}}
F
felipe_eng
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:TESTE2Createdon:18/03/2011,09:28:45Author:Felipe--%><%@pagecontentType="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><scripttype="text/javascript">functionalterarImagem(){document.form1.img.src=document.form1.imagem.value;}</script></head><body><formname="form1"action="/GD_Rural/TesteServlet"method="post"><imgname="img"src=""/><inputtype="file"name="imagem"onchange="alterarImagem()"/><inputtype="submit"name="bt"value="Salvar"/></form></body></html>
TesteServlet.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagecom.sistema.entidades;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.sistema.banco.ConnectionFactory;importjava.awt.image.BufferedImage;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.InputStream;importjava.sql.*;importjavax.imageio.ImageIO;importjavax.servlet.ServletOutputStream;importjava.sql.PreparedStatement;importjava.sql.Connection;importjava.sql.SQLException;/** * * @author Felipe */// Importar aqui todas as classes necessáriaspublicclassTesteServletextendsHttpServlet{// ENCAMINHA PARA GRAVARprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse){try{StringurlImagem=request.getParameter("imagem");gravarImagem(urlImagem);System.out.println("Imagem gravada!");}catch(Exceptione){e.printStackTrace();}}// ENCAMINHA PARA EXIBIR NA SEGUNDA PÁGINA 'index.jsp'protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse){try{Integercodigo=Integer.parseInt(request.getParameter("comando"));ServletOutputStreamsos=response.getOutputStream();sos.write(buscarImagem(codigo));}catch(Exceptione){e.printStackTrace();}}publicvoidgravarImagem(StringurlImagem)throwsException{Filefile=newFile(urlImagem);BufferedImageimg=ImageIO.read(file);Connectioncon=ConnectionFactory.getConexao();ByteArrayOutputStreamb=newByteArrayOutputStream();ImageIO.write(img,"jpg",b);byte[]imgArray=b.toByteArray();Stringsql="INSERT INTO tb_imagens VALUES( NULL, ? )";PreparedStatementstm=con.prepareStatement(sql);stm.setBytes(1,imgArray);stm.executeUpdate();stm.close();}publicbyte[]buscarImagem(Integercodigo)throwsException{Connectioncon=ConnectionFactory.getConexao();Stringsql="SELECT * FROM tb_imagens WHERE codigo=?";PreparedStatementstm=con.prepareStatement(sql);stm.setInt(1,codigo);ResultSetrs=stm.executeQuery();if(!rs.next())thrownewRuntimeException("Registro não encontrado.");else{InputStreaminput=rs.getBinaryStream("imagem");BufferedImagebuffer=ImageIO.read(input);ByteArrayOutputStreamb=newByteArrayOutputStream();ImageIO.write(buffer,"jpg",b);byte[]imgArray=b.toByteArray();returnimgArray;}}}
ConnectionFactory.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagecom.sistema.banco;/** * * @author Felipe */importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{publicstaticConnectiongetConexao()throwsSQLException{try{Class.forName("com.mysql.jdbc.Driver");System.out.println("Conectado!");returnDriverManager.getConnection("jdbc:mysql://localhost:3306/gd_rural","root","admin");}catch(ClassNotFoundExceptione){thrownewSQLException(e.getMessage());}}}
Verifique também se o nome do projeto é esse mesmo.
J
Javaxxxx
Obs.: Execute o projeto pelo eclipse.
J
javajc
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
Mr.style
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.
Kanin_Dragon
Concordo com a solução proposta pelo amigo acima.
Realmente e necessário que essas imagens sejam salvar no banco ?
dbasilioesp
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.
F
felipe_eng
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.
gilsonk
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!
F
felipe_eng
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
F
felipe_eng
andei mechendo em alguns códigos aqui e ta gerando a seguinte Exception:
<%--Document:TESTE2Createdon:18/03/2011,09:28:45Author:Felipe--%><%@pagecontentType="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><scripttype="text/javascript">functionalterarImagem(){document.form1.img.src=document.form1.imagem.value;}</script></head><body><formname="form1"action="http://localhost:8084/GD_Rural/TesteServlet"method="post"><imgname="img"src=""/><inputtype="file"name="imagem"onchange="alterarImagem()"/><inputtype="submit"name="bt"value="Salvar"/></form></body></html>
TesteServlet.java
/* * To change this template, choose Tools | Templates * and open the template in the editor. */importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.sistema.banco.ConnectionFactory;importjava.awt.image.BufferedImage;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.InputStream;importjava.sql.*;importjavax.imageio.*;importjavax.servlet.ServletOutputStream;importjava.sql.PreparedStatement;importjava.sql.Connection;importjava.sql.SQLException;/** * * @author Felipe */publicclassTesteServletextendsHttpServlet{/** * 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 */protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=UTF-8");PrintWriterout=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();}}@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{processRequest(request,response);}@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{try{StringurlImagem=request.getParameter("imagem");gravarImagem(urlImagem);System.out.println("Imagem gravada!");}catch(Exceptione){e.printStackTrace();}}publicvoidgravarImagem(StringurlImagem)throwsException{System.out.println("urlImagemmmmm = "+urlImagem);Filefile=newFile(urlImagem);BufferedImageimg=ImageIO.read(file);ByteArrayOutputStreamb=newByteArrayOutputStream();ImageIO.write(img,"jpg",b);byte[]imgArray=b.toByteArray();Stringsql="INSERT INTO tb_imagens VALUES( NULL, ? )";PreparedStatementstm=ConnectionFactory.getConexao().prepareStatement(sql);stm.setBytes(1,imgArray);stm.executeUpdate();stm.close();}@OverridepublicStringgetServletInfo(){return"Short description";}// </editor-fold>}
alguém sabe o motivo de estar gerando essa Exception?
F
felipe_eng
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:
<%@pagecontentType="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><scripttype="text/javascript">functionsubmeteForm1(){varcampo_oculto=document.getElementById("oculto");varcampo_file=document.getElementById("arquivo");campo_oculto.value=campo_file.value;document.form1.submit();}</script></head><body><formname="form1"action="http://localhost:8084/GD_Rural/TesteServlet"method="post"><inputname="hidden_file"id="oculto"type="hidden"/><p><inputid="arquivo"name="file"type="file"size="100"maxlength="100"/></p><p><inputname="id"type="text"id="id"/></p><p></p><p><inputtype="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