Upload de Imagens ou Salvar Imagem no MySQL
22/03/2011
0
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
Posts
22/03/2011
Robson Teixeira
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
23/03/2011
Davi Costa
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
23/03/2011
Felipe Scherer
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)
23/03/2011
Davi Costa
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
}
}
23/03/2011
Davi Costa
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
23/03/2011
Felipe Scherer
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"); } }
23/03/2011
Davi Costa
Esse:
urlImagemmmmm = DSC02840.JPG
O servidor nunca vai encontrar ele precisa do caminho completo, por exemplo:
C:\DSC02840.JPG
Att Davi
23/03/2011
Felipe Scherer
é 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.
23/03/2011
Davi Costa
Podem te ajudar bastante.
Att Davi
23/03/2011
Robson Teixeira
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
23/03/2011
Felipe Scherer
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?
23/03/2011
Davi Costa
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
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?
23/03/2011
Davi Costa
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
23/03/2011
Felipe Scherer
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
Clique aqui para fazer login e interagir na Comunidade :)