2010-01-27 8 views
15

J'essaie de créer un fichier PDF en fonction des informations contenues dans une base de données. Sachez que j'ai besoin de récupérer une image TIFF stockée sous forme de BLOB sur une base de données mysql à partir de Java. Et je ne sais pas comment le faire. Les exemples que j'ai trouvés montrent comment le récupérer et l'enregistrer en tant que fichier (mais sur le disque) et j'ai dû résider dans la mémoire.Récupérer une image stockée en tant que BLOB sur une base de données MYSQL

Nom de la table: IMAGENES_REGISTROS

blob Nom du champ: IMAGEN

Des idées?

+0

utilisez-vous JDBC simple? – Bozho

+0

Oui Bozho, JDBC simple avec la librairie MySQL pour Java. – Sheldon

+0

voir ma réponse mise à jour - avéré il ya une autre façon de le faire :) – Bozho

Répondre

18

Sur votre ResultSet appel:

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

Vous pouvez appeler:

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

Comme BalusC a noté dans son commentaire, vous feriez mieux d'utiliser:

InputStream binaryStream = resultSet.getBinaryStream(yourBlobColumnIndex); 

Et alors le code dépend de la façon dont vous allez lire et intégrer l'image.

+0

Merci, juste un commentaire. imageBlob renvoie un long. Et getBytes attend un entier. J'analyse (Integer.ParseInt ..) le long, et cela fonctionne. Je ne sais pas si ça va finir par poser des problèmes. Existe-t-il un autre moyen? merci – Sheldon

+3

N'utilisez pas 'ResultSet # getBlob()' ou 'ResultSet # getBytes()'. Utilisez juste 'ResultSet # getBinaryStream()'. – BalusC

+0

est-ce juste une méthode pratique, ou y at-il quelque chose de plus? – 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

Vous devez modifier votre réponse pour inclure cette information, pas ajouter un commentaire. Plus d'explications sont bonnes - les réponses au code seulement sont découragées. – 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);    
      } 
     } 
    } 
Questions connexes