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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    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 expérimenté
    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
    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 expérimenté
    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
    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 confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    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 émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    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 expérimenté
    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
    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 confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 188
    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?

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

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, 14h29
  2. Réponses: 0
    Dernier message: 28/02/2011, 13h48
  3. Création de fichier à partir d'un bean java
    Par AmFaye dans le forum JSF
    Réponses: 8
    Dernier message: 27/01/2010, 21h05
  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, 10h09
  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, 13h39

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