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

Entrée/Sortie Java Discussion :

Pb de création de fichier à partir d'un blob


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut Pb de création de fichier à partir d'un blob
    Bonjour,

    Je travaille sur une appli java web avec Hibernate 2 et Struts.
    Mon pb est que je dois créer des fichiers de tout type (pdf,word..) à partir de longblob stockés dans une base de données MySQL.

    Avec Hibernate, je récupère le contenu de ce blob (content) sous la forme d'un String que je transforme en byte[]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String content = table.getContent();
    InputStream is = new ByteArrayInputStream(content.getBytes());
    byte[] contentByte = new byte[8192];
    FileOutputStream fos = new FileOutputStream(fichierATransferer+ "/"+table.getFilename());
    Puis je parcours ce byte[] et je stocke le tout dans un fichier créé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int bytesRead = 0;
    while ((bytesRead = is.read(contentByte, 0, 8192)) != -1) {
    	fos.write(contentByte, 0, bytesRead);
    } // On ferme les flux
    fos.close();
    J'arrive bien à créer mon fichier et à le remplir (ce dernier à la taille de ce qui est dans mon blob). Seulement si je l'ouvre, je n'obtiens que des jolis carrés!

    Je ne comprend pas ce que j'ai fait de mal. Quelqu'un pourrait-il me donner un peu d'aide?

    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Etant donné que tu récupères une chaine de caractères, je pense qu'il serait plus simple de l'utiliser directement plutôt que de passer par un tableau de bytes.Pour ça il suffit de lire les caractères un par un avec string.charAt() et en incrémentant un compteur.

    Ou bien tu peux aussi lire la chaîne avec un flux de lecture StringReader. Dans ce cas, il faudrait également utiliser un FileWriter pour éviter les problèmes de casting.

    Concernant ton code, je ne sais pas si le problème vient de là, mais il y a une petite erreur ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int bytesRead = 0;
    while ((bytesRead = is.read(contentByte, 0, 8192)) != -1) {
    	fos.write(contentByte, 0, bytesRead);
    } // On ferme les flux
    fos.close();
    Tu dois utiliser (BUFFER_SIZE - 1) à la place puisque tu commences à 0.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par had35
    Tu dois utiliser (BUFFER_SIZE - 1) à la place puisque tu commences à 0.
    Désolé, il n'y a pas d'erreur de ce côté, contrairement à ce que je croyais puisque c'est bien la taille du tampon qui est demandée

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    J'ai suivi ton conseil en passant par un flux de caractères (sr) et par un FileWriter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String content = table.getContent();
    StringReader sr = new StringReader(content);
    char[] cbuf = new char[content.length()];
    content.getChars(0,content.length(),cbuf,0);
    FileWriter fw = new FileWriter(fichierATransferer+"/"+table.getFilename());
     
    int bytesRead = 0;
    while ((bytesRead = sr.read(cbuf, 0, 8192)) != -1){
    	fw.write(content,0,bytesRead);
    }
    fw.close();
    Maintenant, j'obtiens un fichier à moitié "décodé" (alternance de texte et de carrés) mais dont le texte se répète en l'ouvrant avec un bloc note et un fichier complètement illisible qd j'utilise la bonne application (word par exemple).

    Je n'aurai pas un pb de boucle (répétition) et faut-il préciser l'extension du fichier?

  5. #5
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Est-ce que ton texte est codé en UTF-8 en base ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    S'il s'agit bien de l'interclassement sur cet attribut longblob, alors non mon texte n'est pas codé en UTF-8 en base. Le faut-il?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    C'est vrai que ton problème ressemble à un problème d'encodage. Lorsque tu demandes si l'encodage devrait être en utf8, veux-tu dire que c'est toi qui a entré les données dans la base ? Si tu l'as fait à partir de Java, le texte a pu être converti en utf16 alors qu'à mon souvenir les blob sont codés en ANSI.

    Pour connaître l'encodage, tu pourrais essayer d'ouvrir le fichier texte avec Firefox et changer l'encodage dans le menu affichage. C'est un peu lourdot, mais bon

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    En fait ces blobs sont insérés en php par une autre application que celle que je réalise.
    Du coup, j'ai été voir dans phpMyAdmin pour voir en quoi sont encodé les blobs et UTF-8 n'est pas sélectionné.
    J'ai étudié le code d'insertion de ces blobs et ils sont codés en ANSI.

    Il semblerait donc que çà ne soit pas un pb de codage des blobs.

    Existe-t-il une possibilité de changer le mapping pour que le type renvoyé pour ces blobs ne soient un String mais un blob?
    Ou est ce que quelqu'un a une autre suggestion?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    Bon j'ai changé mon mapping et maintenant je récupère des blobs.

    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
    // Transfert du contenu du fichier
    Blob content = table.getContent();
    InputStream is = null;
    try {
    	byte[] buf = new byte[(int) content.length()];
    	is = content.getBinaryStream();
    } catch (SQLException e) {
    	e.printStackTrace();
    }
    byte[] contentByte = new byte[table.getFilesize().intValue()];
    FileOutputStream fos = new FileOutputStream(fichierATransferer+ "/"+table.getFilename());
     
    int bytesRead = 0;
    while ((bytesRead = is.read(contentByte, 0, 8192)) != -1) {
         fos.write(contentByte, 0, bytesRead);
    } // On ferme les flux
    fos.close();
    Maintenant, j'arrive à récupérer des images, des jsp, des word (qui n'ont que des images) mais j'ai tjs mes pbs de carrés quand j'ouvre des word avec texte
    ou des html.
    Quelqu'un sait pourquoi?

  10. #10
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Si tu essayais quelquechose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    OutputStreamWriter out =
        new OutputStreamWriter(
            new FileOutputStream(<fichier>), "UTF-8");
     
    out.write(new String(contentByte, "UTF-8"));
    out.close();

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    Ca marche encore moins...Je ne peux plus récupérer aucun type de fichiers

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Pourrais-tu nous passer en fichier joint un exemple de ce que tu obtiens (sans tentative de conversion) ?

  13. #13
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Tu veux dire que ton champ Blob tu peux avoir soit une image, soit un texte ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    Je joins un exemple de fichier Word que j'obtiens.

    Je peux avoir tout type de fichier à récupérer (word,html,jsp,jpeg,gz,pck...)
    Fichiers attachés Fichiers attachés

  15. #15
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Hello,

    J'ai 2 routines qui pourront peut être t'aider.

    Je dev sous WSAP avec hybernate et MySQL , je converti des byte[] en BLOB dans la base et vis versa , cela fonctionne trés bien :

    public void TableauDeBytesVersFichier (byte[] tableau, String fic) throws java.io.IOException {
    try {
    java.io.FileWriter f = new java.io.FileWriter(fic);
    for (int i = 0; i < tableau.length; i++) {
    f.write((int)tableau[i]);
    }
    f.close();
    }
    catch(IOException e){
    System.out.println(e+"erreur lors de la lecture du fichier");
    }

    }

    /**
    * Permet de copier le contenu d'un fichier dans un tableau byte[]
    **/
    public byte[] FichierVersTableauDeBytes (String fic) throws java.io.IOException {
    java.io.File fichier = new File(fic);
    int i=0;
    int ch;
    byte[] tableau;
    try {
    FileInputStream f= new FileInputStream(fichier);
    try{
    tableau = new byte[(int)fichier.length()];
    while((ch=f.read())!=-1){
    tableau[i]=(byte)ch;
    i++;
    }
    }
    finally{
    f.close();
    }
    return tableau;
    }
    catch(FileNotFoundException ef){
    System.out.println("fichier introuvable");
    return null;
    }
    catch(IOException e){
    System.out.println(e+"erreur lors de la lecture du fichier");
    return null;
    }


    Par contre j'ai un problème aussi

    Si le Tableau fait plus de 65535 soit un fichier de 64Ko, ca plante , que puis-je faire ???



    }

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par clairette
    Je joins un exemple de fichier Word que j'obtiens.
    Le fichier que tu as joins ne nous sert à rien je voulais parler d'un fichier que tu aurais construit en écrivant le tableau d'octet que tu récupères. En fait, je voulais en fait voir les codes point des caractères que tu récupères.

    Citation Envoyé par clairette
    Je peux avoir tout type de fichier à récupérer (word,html,jsp,jpeg,gz,pck...)
    Tu n'as de problème qu'avec le texte ou tu en as également avec les images ?

  17. #17
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par Wavy
    Par contre j'ai un problème aussi

    Si le Tableau fait plus de 65535 soit un fichier de 64Ko, ca plante , que puis-je faire ???
    pourrais tu expliciter le terme "ça plante" ?
    tu as un message d'erreur ?

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    As-tu remarqué que ton fichier ne contient aucune données ? L'espace est entièrement occupé par des zéros.

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    Points : 81
    Points
    81
    Par défaut
    Je viens de re-tester en modifiant mon code et magie, çà marche!
    Je ne comprend pas la différence entre avant et maintenant, mais bon!
    Le texte et les images sont bien récupérés. Il me reste les html qui ne passent pas avec pour erreur:

    java.lang.IndexOutOfBoundsException
    java.io.ByteArrayInputStream.read(ByteArrayInputStream.java:160)

    pour ce 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
     
    Blob content = table.getContent();
    InputStream is = null;
    try {
    	byte[] buf = new byte[(int) content.length()];
    	is = content.getBinaryStream();
    } catch (SQLException e) {
    	e.printStackTrace();
    }
    byte[] contentByte = new byte[table.getFilesize().intValue()];
    FileOutputStream fos = new FileOutputStream(fichierATransferer+ "/"+table.getFilename());
     
    int bytesRead = 0;
    while ((bytesRead = is.read(contentByte, 0, 8192)) != -1) {
    	fos.write(contentByte, 0, bytesRead);
    } // On ferme les flux
    fos.close();
    Y-a-t-il une différence notable entre les .htm et le reste des fichiers possibles?

  20. #20
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    c'est quoi ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] contentByte = new byte[table.getFilesize().intValue()];

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Shell/Awk] Création de fichiers à partir d'un champ
    Par thomas59000 dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 06/05/2011, 15h29
  2. Réponses: 0
    Dernier message: 28/02/2011, 14h48
  3. Création de fichier à partir d'un bean java
    Par AmFaye dans le forum JSF
    Réponses: 8
    Dernier message: 27/01/2010, 22h05
  4. Régénérer un fichier à partir d'un blob
    Par watal dans le forum PL/SQL
    Réponses: 4
    Dernier message: 29/08/2008, 11h09
  5. création de tables à partir d'un fichier XML
    Par magic charly dans le forum Oracle
    Réponses: 2
    Dernier message: 03/04/2006, 14h39

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