IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

[java - SQL] transformer une Image en BLOB ?


Sujet :

JDBC Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut [java - SQL] transformer une Image en BLOB ?
    je réussi a extraire des blobs et a les passer en images java (des instances de la classe Java "Image") grace a la methode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /**
         * private method used for retrieving an image by knowing its generic part ID
         * this method converts the Blob stored in DB in a java object "Image"
         * @param id
         * @return : a java "Image"
         */
        private Image retrieveImageByID(Integer id) {
            if (id==null) {
                System.out.println("DBPicker: can not retrieve an image with part's ID null");
                return null;
            }
            else {
                try {       
                    Statement stmt = connection.createStatement();          
                    String query = "SELECT image FROM generic_part WHERE id = " + id;
     
                    // copy the image from the DB to Blob.
                    ResultSet rs = stmt.executeQuery(query);    
                    if(rs.next()) {
                              // "1" because the blob is the only field retrieved by the query : 
                              Blob blob = rs.getBlob(1); 
                              InputStream in = blob.getBinaryStream();
                              Image image = ImageIO.read(in);
                              return image;
                    }
                  }
                  catch (Exception ex){
                      ex.printStackTrace();
                  }
                  System.out.println("DBPicker: Warning, image with part's ID :"+id + 
                          "can not be loaded");
                  return null;
            }        
        }
    mais j'aimerai bien faire l'opération inverse pour sauvegarder des images dans la base à partir de mon application. voyez-vous comment faire ?

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 165
    Par défaut
    J'en sais rien, juste au passage pense a fermer ton statement pour pas laisser trainer des connexions ouvertes Sinon je suis intéressé aussi par la réponse que tu vas (j'espere) obtenir ^^

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    j'ai fini par trouver, mais je ne saurais pas dire pourquoi ca marche, enfin j'ai compris la philosophie. le main problem vient du fait que java definit une interface "blob" mais aucune classe du jdk n'implemente cette interface, impossible de creer un objet Blob.

    pour en revenir, voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private ByteArrayInputStream getBlobByImage(Image image) {        
            if (image!=null) {           
                BufferedImage buff = ImgTools.toBufferedImage(image);               
                byte[] imageBytes;
                if(buff != null) {
                     BufferedImage bImage = (BufferedImage)buff;
                     ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
                     try {
                         ImageIO.write(bImage, "jpeg", baos);
                     } catch (IOException e) {
                         throw new IllegalStateException(e.toString());
                     }
                     imageBytes = baos.toByteArray();    
                }
                else {
                 imageBytes = new byte[0];
                 System.out.println("PCD error : the buffered image is null");
                }
                ByteArrayInputStream inStream = new ByteArrayInputStream(imageBytes);
                return inStream;
            }        
            else {
                System.out.println("PCD error : the image is null");
                byte[] imageNullBytes = new byte[0];
                return new ByteArrayInputStream(imageNullBytes);
            }


    que j'utilise par exemple comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    /**
         * This method adds a Part in the table generic_part
         * If the id of the part already exists in the table, an other ID is fixed
         * and a warning message is displayed. However this case is not supposed to happen
         * except if someone else has modified the DB between the launch of the program and
         * the call of this method.
         * @param p : the part to be added in the database
         */
        public void addGenericPartInDB(Part p) {
            Integer idToBeSet = p.getId();
     
            // we verify that the part's ID doesn't exist in the database
            boolean exists = isIDexistsInGenericPartDB(idToBeSet);
            System.out.println(idToBeSet + " exists in DB ? : "+ exists);
            if (!exists) {
                idToBeSet = getNewIdForGenericPart();
            }
     
            // we retrieve the ID of the type by using the string of the type :
            Integer retrievedIdType = getIdTypeByStringType(p.getType());
     
            // we retrieve the "BLOB" by the image
     
           ByteArrayInputStream imageBlobStream = getBlobByImage(p.getImage());
     
            // we perform the main query
            String query_main = "INSERT INTO generic_part VALUES (" +
                idToBeSet + ", " +
                "'" + p.getName() + "', " +
                "'" + p.getNickName() + "', " +
                "?" + ", " +
                p.getDefaultWidth() + ", " +
                p.getDefaultHeight() + ", " +
                retrievedIdType + ", " +
                p.getPrice() + ")";  
     
            try {
                PreparedStatement pstmt = 
                    (PreparedStatement) connection.prepareStatement(query_main);
                pstmt.setBinaryStream(1,imageBlobStream,imageBlobStream.available());
    //          execute statement
                pstmt.executeUpdate();
                System.out.println("generic part added in the DB");
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("\n DB Error :can not perform query : \"" + query_main + "\"");
            }
        }
    on fait passer un super binarystream dans un preparedstatement et ca macrhe

  4. #4
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    au fait, j'ai résolu ce problème précis, mais j'aimerai quand meme bien en savoir un peu plus sur le sujet (et je pense ne pas etre le seul), donc toute info reste la bienvenue

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformer une image en signal 1D
    Par Orus dans le forum Images
    Réponses: 5
    Dernier message: 14/03/2007, 14h26
  2. comment transformer une image en matrice
    Par liliana07 dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/03/2007, 14h53
  3. Transformer une image
    Par blaise4714 dans le forum Images
    Réponses: 3
    Dernier message: 27/11/2006, 14h30
  4. [SQL] Ecraser une image dans une table.
    Par klerdesign dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 10/10/2006, 12h50
  5. Réponses: 3
    Dernier message: 12/06/2006, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo