2010-01-27 4 views
15

Ich versuche, ein PDF basierend auf den Informationen in einer Datenbank zu erstellen. Wissen, dass ich ein TIFF-Bild abrufen muss, das als ein BLOB in einer mysql-Datenbank von Java gespeichert wird. Und ich weiß nicht, wie ich es machen soll. Die Beispiele, die ich gefunden habe, zeigen, wie man es abruft und es als eine Datei (aber auf der Festplatte) speichert, und ich musste im Speicher bleiben.Rufen Sie ein Image ab, das als BLOB in einer MYSQL-DB gespeichert wird

Tabellenname: IMAGENES_REGISTROS

BLOB Feldname: IMAGEN

Irgendwelche Ideen?

+0

verwenden Sie Ebene JDBC? – Bozho

+0

Ja Bozho, plain JDBC mit der MySQL-Bibliothek für Java. – Sheldon

+0

sehe meine aktualisierte Antwort - stellte sich heraus, es gibt eine alternative Möglichkeit, es zu tun :) – Bozho

Antwort

18

Auf Ihrem ResultSet Aufruf:

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

Alternativ können Sie anrufen:

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

Wie BalusC in seinem Kommentar erwähnt, Sie sollten besser nutzen:

InputStream binaryStream = resultSet.getBinaryStream(yourBlobColumnIndex); 

Und Der Code hängt davon ab, wie Sie das Bild lesen und einbetten.

+0

Danke, nur ein Kommentar. imageBlob gibt ein Long zurück. Und getBytes erwartet einen Integer. Ich parse (Integer.ParseInt ..) die Long, und es funktioniert. Ich weiß nicht, ob das irgendwann Probleme bringen wird. Gibt es einen anderen Weg? Danke – Sheldon

+3

Verwenden Sie nicht 'ResultSet # getBlob()' oder 'ResultSet # getBytes()'. Verwenden Sie einfach 'ResultSet # getBinaryStream() '. – BalusC

+0

ist es nur eine bequeme Methode, oder gibt es etwas mehr dazu? – 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

Sie sollten Ihre Antwort bearbeiten, um diese Informationen aufzunehmen, keinen Kommentar hinzufügen. Mehr Erklärung ist gut - Code-only-Antworten werden abgeraten. – 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);    
      } 
     } 
    }