Recuperar imagem do banco

Pessoal já procurei aqui pelo forum sobre gravação e recuperação de imagens, porém, todos dizem pra fazer com jsp + servlets. O que eu preciso é fazer só com JSP. Eu fiz isso:

Para inserir:


<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page language="java" %>
<%@ page import="java.awt.image.*"%>
<%@ page import="javax.imageio.ImageIO"%>
<%@ page import="java.awt.image.BufferedImage,java.util.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.io.File"%>
<%@ page import="java.util.*,com.oreilly.servlet.MultipartRequest"%>

<html>
<%
try{
String filename = "";

   MultipartRequest multi = new MultipartRequest(request,".",5*1024*1024);
   Enumeration files = multi.getFileNames();
   File f = null;

    while(files.hasMoreElements()){
      String name = (String)files.nextElement();
      filename = multi.getFilesystemName(name);
      String type = multi.getContentType(name);
      f = multi.getFile(name);
      System.out.println("O arquivo é: "+f);
    }
    
   Connection con = null;
   String userName = "sa";
   String password = "";
   
   try{
	   out.println("Verificando se o driver esta instalado...");
	   Class.forName("net.sourceforge.jtds.jdbc.Driver");
	   out.println("Driver está instalado e funcionando...");

	   }catch(ClassNotFoundException ex){
	   out.println("Driver JDBC-JTDS não encontrado!!");
	   }
	   catch(Exception ex){
	   System.out.println("Problemas na conexão com o DRIVER JTDS...");
	   System.out.println(ex.toString());
	   }

	   try{
	   out.println("Conectando ao Banco de Dados...");
	   con = DriverManager.getConnection("jdbc:jtds:sqlserver://192.168.0.4:1433/;DatabaseName=Homolog",userName,password);

	   }catch (SQLException ex){
	   out.println("Problemas na conexão com a fonte de dados!");
	   out.println(ex.toString());
	   } 
   
   Statement stmt = con.createStatement();
   InputStream is = new FileInputStream(f);
   byte b[] = new byte[is.available()];
   is.read(b);
   int flag = 0;

   try{
	 //Pega o ID MAX
	 String IDsql = "select MAX(ID)+1 as id from imagens";
	 ResultSet rs = stmt.executeQuery(IDsql);
	 rs.next();
	 String id = rs.getString("id");
	 String nome = "Teste"+id;
	 
	 //Faz insert
     String sql = "INSERT into dbo.imagens(id,nome,imagem) values('"+ id + "','"+ nome +"','" + b + "')";
     System.out.println(sql);
     stmt.execute(sql);
     flag = 1;
   }
   catch(Exception e){
	   e.printStackTrace();
   }
   
   //Confirma a execução das queryes
   if(flag == 1){
     System.out.println("Query Executada");
   }

   stmt.close();
}
catch(SQLException ex){
	ex.printStackTrace();
}

catch(Exception e){
	e.printStackTrace();
}

out.println("Imagem Adicionada");
%>
</html>

Para recuperar e exbir numa tag IMG:


<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
<%@ page language="java" %>
<%@ page import="java.awt.image.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.io.File"%>
<%@ page import="javax.imageio.ImageIO"%>
<%@ page import="java.awt.image.BufferedImage,java.util.*"%>
<%@ page import="java.awt.*"%>
<html>
<head><title>JSP Page</title></head>
<body>
<table border="1">
<%
try{
   //int returnValue = 0;
   Connection con = null;
   Statement stmt = null;
   ResultSet rs = null;
   OutputStream os = null;
   //Blob blob = null;
   //String text;
   String userName = "sa";
   String password = "";
   text = request.getParameter("text");
   try{
	  Class.forName("net.sourceforge.jtds.jdbc.Driver");
          con = DriverManager.getConnection("jdbc:jtds:sqlserver://192.168.0.4:1433;DatabaseNAme=Homolog",userName,password);
      
      InputStream sImage;
   
   String sql = "SELECT imagem as imagem FROM imagens where id = (select max(id) from imagens)";
   con.setAutoCommit(false);
   stmt = con.createStatement();
   rs = stmt.executeQuery(sql);
   int i = 1;
    if(rs.next()){
      String len1 = rs.getString("imagem");
      int len = len1.length();
      
      byte [] b = new byte[len];
      
      sImage = rs.getBinaryStream("imagem");
      response.setContentType(rs.getString("imagem"));
      int index = sImage.read(b, 0, len);
      String caminho = "C:/imagem/img"+i+".JPG";
      OutputStream outImg = new FileOutputStream(caminho);
       while (index != -1){
         outImg.write(b, 0, index);
		 index = sImage.read(b, 0, len);
		
		 out.println("<tr><td>");
		 out.println(index);
		 out.println("</td>");
		 out.println("<td>");
		 out.println(outImg);
		 out.println("</td></tr>");
		 out.println("<tr><td>");
		 out.println("<img src='"+caminho+"'>");
		 out.println("</td></tr>");
		 
	   }
	 outImg.close();
	 i++;
   }
   else{
	returnValue = 1;
   }
 }
 catch(Exception e){
    e.printStackTrace();
 }
}
catch(Exception ex){
	ex.printStackTrace();
}
%>
</table>
</body>
</html>

Na verdade eu fui pegando esses codigos de varias páginas e fui juntando. Estou começando em jsp agora.Essa aplicação consegue gravar o banco. Na hora de recuperar ele cria o arquivo JPG no C:/imagem, mas esse arquivo é vazio. Eu não sei se o erro está na hora que ele grava ou na hora que ele recupera…

alguém poderia me ajudar?

Obrigado!

Opa beleza?

Então, consegui fazer funcionar parcialmente. Vejam como ficou o codigo de recuperaçã ode arquivos:


<%@ page contentType="text/html"%>
<%@ page pageEncoding="UTF-8"%>
<%@ page language="java" %>
<%@ page import="java.awt.image.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="java.io.File"%>
<%@ page import="javax.imageio.ImageIO"%>
<%@ page import="java.awt.image.BufferedImage,java.util.*"%>
<%@ page import="java.awt.*"%>
<html>
<head><title>JSP Page</title></head>
<body>
<table border="1">
<tr><td>
<%
try{
   javax.servlet.http.HttpServletResponse res = null;

   Connection con = null;
   Statement stmt = null;
   ResultSet rs = null;
   String userName = "sa";
   String password = "";
   BufferedImage imagem;
   try{
	  Class.forName("net.sourceforge.jtds.jdbc.Driver");
      con = DriverManager.getConnection("jdbc:jtds:sqlserver://192.168.0.4:1433;DatabaseNAme=Homolog",userName,password);
      System.out.println("Declaração de Variáveis");

   String sql = "SELECT imagem as imagem FROM imagens where id = (select max(id) from imagens)";
   con.setAutoCommit(false);
   stmt = con.createStatement();
   rs = stmt.executeQuery(sql);
   int i = 1;
   String caminho = "C:/imagem/img"+i+".jpg";
   byte[] imgBytes = null;
   if (rs.next()){     
       imgBytes = rs.getBytes(1);     
       OutputStream saida = new FileOutputStream(caminho);     
              
       saida.write(imgBytes);     
       saida.close();     
       System.out.println(saida);                 
         
       System.out.println("Tamanho da imagem: " + imgBytes.length);           
    }             
 File sourceimage = new File(caminho);
 imagem = ImageIO.read(sourceimage);  
      
    rs.close();        
          
 stmt.close();  
 out.println("<img src='"+caminho+"'><br><br>O Tamanho da imagem é:"+imgBytes.length+"<br><br>"+caminho);
 }
 catch(Exception e){
    e.printStackTrace();
 }
}
catch(Exception ex){
	ex.printStackTrace();
}
%>
</td></tr>
</table>
</body>
</html>

Ele está recuperando corretamente o arquivo do banco e montando certinho na pasta C:/imagem. Porém, não consigo exibir no jsp. Na tag img, ele não consegue achar o caminho, diz que não existe. Ja tentei criar o arquivo dentro do Tom Cat e mesmo assim ele não consegue achar o arquivo. O pior é que nao retorna nenhum erro.

Haveria talvez uma forma d’eu recuperar a imagem sem ter que criar um arquivo no servidor?

Obrigado mais uma vez!