2011-04-28 4 views
0

J'ai un code Java qui s'est une image de la base de données et il enregistre dans un fichier, mais, quand je l'ouvre dans tous les programmes, mais Photoshop j'obtiens une erreur similaire à:PostgreSQL obtenir l'image de base de données

"Il peut être endommagé ou utiliser un format de fichier que Preview ne reconnaît pas." - Ce paticular est de l'aperçu sur MAC. La base de données que je tire est PostgreSQL et la colonne est un bytea.

Mon code est le suivant:

public static void main(String[] args) throws Exception { 
     Connection conn = null; 
     try { 
      conn = ConnectionManager.getConnection(); 

      String sql = "SELECT content from asset "; 
      PreparedStatement stmt = conn.prepareStatement(sql); 
      ResultSet resultSet = stmt.executeQuery(); 
      while (resultSet.next()) { 

       File image = new File("/Users/esklein/testing"+UUID.randomUUID()+".jpg"); 
       FileOutputStream fos = new FileOutputStream(image); 

       byte[] buffer = new byte[256]; 

       // 
       // Get the binary stream of our BLOB data 
       // 
       InputStream is = resultSet.getBinaryStream("content"); 
       while (is.read(buffer) > 0) { 
        fos.write(buffer); 
       } 

       fos.close(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      if (conn != null && !conn.isClosed()) { 
       conn.close(); 
      } 
     } 
    } 

Toutes les idées pourquoi cela ne crachant une image qui peut être ouvert dans un fichier? Merci

+2

Etes-vous certain que l'image est un jpg? Photoshop pourrait l'ouvrir parce qu'il est assez intelligent pour vérifier le format de fichier pour le type plutôt que de s'appuyer sur l'extension comme la plupart des visionneuses d'images. A part ça, vous risquez d'avoir des ordures à la fin de votre fichier si vous n'effacez pas votre tampon après chaque écriture. Que se passe-t-il lorsque les dernières itérations sont inférieures à 256 octets? Les octets restants de la lecture précédente peuvent toujours se trouver dans le tampon et être écrits en tant que déchets à la fin du fichier. Encore une fois, photoshop pourrait être assez intelligent pour ignorer ce que les autres téléspectateurs ne peuvent pas. – Jberg

+0

1. Êtes-vous sûr que c'est un fichier JPEG? regarder dans les premiers octets, il devrait contenir une chaîne "JFIF" 2. Pouvez-vous tester si la taille du fichier est la même que la longueur des données dans la base de données? 'select octet_length (...)' – leonbloy

Répondre

3
while (is.read(buffer) > 0) { 

Vous supposez que l'opération de lecture remplit toujours le tampon entier. Mais si la taille des données est de 1001 octets et que la taille de la mémoire tampon est de 1000 octets, la dernière lecture n'obtiendra qu'un octet. Vous devez vérifier le nombre d'octets réellement lus, puis

fos.write(buffer, 0, bytesRead) 
+0

+1 complètement à droite – leonbloy

Questions connexes