2010-01-27 45 views
15

Estoy tratando de crear un PDF basado en la información que reside en una base de datos. Saber que necesito recuperar una imagen TIFF que está almacenada como BLOB en una base de datos mysql de Java. Y no sé cómo hacerlo. Los ejemplos que he encontrado muestran cómo recuperarlo y guardarlo como un archivo (pero en el disco) y necesitaba residir en la memoria.Recuperar una imagen almacenada como BLOB en un DB de MYSQL

Nombre de la tabla: IMAGENES_REGISTROS

nombre BLOB Campo: IMAGEN

alguna idea?

+0

¿Está utilizando JDBC normal? – Bozho

+0

Sí Bozho, JDBC simple con MySQL lib para java. – Sheldon

+0

ver mi respuesta actualizada - resultó que hay una manera alternativa de hacerlo :) – Bozho

Respuesta

18

En su ResultSet llamada:

Blob imageBlob = resultSet.getBlob(yourBlobColumnIndex); 
InputStream binaryStream = imageBlob.getBinaryStream(0, imageBlob.length()); 

Alternativamente, puede llamar a:

byte[] imageBytes = imageBlob.getBytes(1, (int) imageBlob.length()); 

Como se señaló BalusC en su comentario, es mejor que utilice:

InputStream binaryStream = resultSet.getBinaryStream(yourBlobColumnIndex); 

Y entonces el código depende de cómo va a leer e insertar la imagen.

+0

Gracias, solo un comentario. imageBlob devuelve un Long. Y getBytes espera un Entero. Analizo (Integer.ParseInt ..) the Long, y funciona. No sé si eventualmente eso traerá problemas. ¿Hay alguna otra manera? gracias – Sheldon

+3

No use 'ResultSet # getBlob()' o 'ResultSet # getBytes()'. Simplemente use 'ResultSet # getBinaryStream()'. – BalusC

+0

¿es solo un método conveniente o hay algo más? – Bozho

0
final String dbURL = "jdbc:mysql://localhost:3306/portfolio"; 
    final String dbUser = "root"; 
    final String dbPass = ""; 

    Connection conn = null; 
    Statement stmt = null; 

    try { 
     //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
     Class.forName("com.mysql.jdbc.Driver"); 

     conn = DriverManager.getConnection(dbURL, dbUser, dbPass); 
     System.out.println("db connected"); 
     stmt = (Statement) conn.createStatement(); 

     ResultSet rs1; 
     rs1 = stmt.executeQuery("select profileImage from tbl_welcome where id = 1117"); 

     if (rs1.next()) { 
      byte[] imgData = rs1.getBytes("profileImage");//Here r1.getBytes() extract byte data from resultSet 
      System.out.println(imgData); 
      response.setHeader("expires", "0"); 
      response.setContentType("image/jpg"); 

      OutputStream os = response.getOutputStream(); // output with the help of outputStream 
      os.write(imgData); 
      os.flush(); 
      os.close(); 

     } 
    } catch (SQLException ex) { 
     // String message = "ERROR: " + ex.getMessage(); 
     ex.printStackTrace(); 
    } finally { 
     if (conn != null) { 
      // closes the database connection 
      try { 
       conn.close(); 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
+2

Debe editar su respuesta para incluir esa información, no agregar un comentario. Más explicaciones son buenas: se desaconsejan las respuestas de solo códigos. – Ajean

0
private void loadFileDataBlobFromDataBase() 
      { 
      List<Blob> bFile = jdbcTemplate.query(sql, new RowMapper<Blob>() { 
       @Override 
       public Blob mapRow(ResultSet rs, int rowNum) 
         throws SQLException { 
        return rs.getBlob(1); 
       } 
      }); 
      if (bFile != null && bFile.size() > 0) { 
       bufReader = new BufferedReader(new InputStreamReader(bFile.get(
         0).getBinaryStream())); 
      } 
      if (null != bufReader) { 
       dataVO record = null; 
       String lineStr = bufReader.readLine(); 
       record = (dataVO) lineMapper.mapLine(lineStr, 1);    
      } 
     } 
    } 
Cuestiones relacionadas