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?
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
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());
}
}
}
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.
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.
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.
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!
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: