Upload de Imagens ou Salvar Imagem no MySQL
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.
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
Curtidas 0
Respostas
Robson Teixeira
22/03/2011
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
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
GOSTEI 0
Davi Costa
22/03/2011
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
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
GOSTEI 0
Felipe Scherer
22/03/2011
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
TesteServlet.java
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)
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)
GOSTEI 0
Davi Costa
22/03/2011
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
}
}
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
}
}
GOSTEI 0
Davi Costa
22/03/2011
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
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
GOSTEI 0
Felipe Scherer
22/03/2011
Fiz a alteração e deu o seguinte a seguinte msg:
urlImagemmmmm = DSC02840.JPGIMAGEM NÃO GRAVADA
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"); } }
GOSTEI 0
Davi Costa
22/03/2011
É 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
Esse:
urlImagemmmmm = DSC02840.JPG
O servidor nunca vai encontrar ele precisa do caminho completo, por exemplo:
C:\DSC02840.JPG
Att Davi
GOSTEI 0
Felipe Scherer
22/03/2011
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.
é 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.
GOSTEI 0
Davi Costa
22/03/2011
Tranquilo cara, precisando conte sempre com a gente, dê uma pesquisada tb em frameworks como jsf ou struts.
Podem te ajudar bastante.
Att Davi
Podem te ajudar bastante.
Att Davi
GOSTEI 0
Robson Teixeira
22/03/2011
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
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
GOSTEI 0
Felipe Scherer
22/03/2011
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?
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?
GOSTEI 0
Davi Costa
22/03/2011
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
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
GOSTEI 0
Felipe Scherer
22/03/2011
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?
GOSTEI 0
Davi Costa
22/03/2011
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
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
GOSTEI 0
Felipe Scherer
22/03/2011
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
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
GOSTEI 0
Davi Costa
22/03/2011
Puxa cara, então o js não funcionou 100%...
Vc fez isso em um browser diferente do IE né...
Faz só teste no IE p ver o que acontece...
É bom depois dá uma pesquisada em js ou até mesmo em jquery para solucionar seu problemas.
Att Davi
Vc fez isso em um browser diferente do IE né...
Faz só teste no IE p ver o que acontece...
É bom depois dá uma pesquisada em js ou até mesmo em jquery para solucionar seu problemas.
Att Davi
GOSTEI 0
Felipe Scherer
22/03/2011
executei o pograma em no Chrome, Firefox e IE 9, veja os resultados:
Firefox:urlImagemmmmm = DSC02840.JPGIMAGEM NÃO GRAVADADSC02840.JPG DSC02840.JPG
IE 9:urlImagemmmmm = C:\fakepath\DSC02840.JPGIMAGEM NÃO GRAVADAC:\fakepath\DSC02840.JPG DSC02840.JPG
Chrome:urlImagemmmmm = C:\fakepath\DSC02840.JPGIMAGEM NÃO GRAVADAC:\fakepath\DSC02840.JPG DSC02840.JPG
No IE e no Firefox quando eu seleciono a imagem aparece na tela o caminho completo dela, ja no Chrome só aparecer o nome.
Firefox:urlImagemmmmm = DSC02840.JPGIMAGEM NÃO GRAVADADSC02840.JPG DSC02840.JPG
IE 9:urlImagemmmmm = C:\fakepath\DSC02840.JPGIMAGEM NÃO GRAVADAC:\fakepath\DSC02840.JPG DSC02840.JPG
Chrome:urlImagemmmmm = C:\fakepath\DSC02840.JPGIMAGEM NÃO GRAVADAC:\fakepath\DSC02840.JPG DSC02840.JPG
No IE e no Firefox quando eu seleciono a imagem aparece na tela o caminho completo dela, ja no Chrome só aparecer o nome.
GOSTEI 0