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

SQL Oracle Discussion :

Prb taille fichier image BLOB


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut Prb taille fichier image BLOB
    Bonjour,
    J'ai stocké une image dans ma base, et je voudrais régénérer un fichier à partir de mon BLOB. J'ai fais une procedure en m'inspirant du code sur ce site La procedure s'execute sans bug mais le problème c'est que le fichier qui est généré est corompu. Apparemment, il a la même taille que le fichier d'origine mais je peux pas l'ouvrir pour le visualiser.

    Je vous met ma procédure ci dessous. Voilà, si quelqu'un peut m'aider, ça serait bien sympa.
    Merci.
    PS : Je travail avec Oracle Express 10G. Sais pas si ça peut servir.

    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
    create or replace PROCEDURE write_blob IS
      v_file       utl_file.file_type;
      v_repertoire VARCHAR2(512) := 'TEMP';
      v_fichier    VARCHAR2(256) := 'heaven2C.JPG';
      v_buffer     RAW(32000);
      v_offset     PLS_INTEGER DEFAULT 1;
      v_taille     PLS_INTEGER;
      v_longueur   PLS_INTEGER;
      v_chunk      PLS_INTEGER;
      v_blob       BLOB;
    BEGIN
      SELECT image INTO v_blob FROM MES_PHOTOS WHERE id = 1;
      dbms_lob.OPEN(v_blob, dbms_lob.lob_readonly);
      v_chunk := dbms_lob.getchunksize(v_blob);
      v_longueur := dbms_lob.getlength(v_blob);
      dbms_output.put_line (v_longueur);
      DBMS_OUTPUT.ENABLE(100000);
      v_file     := utl_file.fopen(v_repertoire, v_fichier, 'w', 32767);
      WHILE v_offset < v_longueur
      LOOP
       dbms_output.put_line ('///////////');
        IF v_longueur - (v_offset - 1) > v_chunk THEN
          v_taille := v_chunk;
        ELSE
          v_taille := v_longueur - (v_offset - 1);
        END IF;
        v_buffer := NULL;
        dbms_lob.READ(v_blob, v_taille, v_offset, v_buffer);
        utl_file.put(file => v_file, buffer => utl_raw.cast_to_varchar2(v_buffer));
        utl_file.fflush(file => v_file);
        v_offset := v_offset + v_taille;
     
    	END LOOP;
      dbms_lob.CLOSE(v_blob);
      utl_file.fclose(v_file);
      EXCEPTION WHEN OTHERS THEN
        IF dbms_lob.ISOPEN(v_blob) = 1 THEN
          dbms_lob.CLOSE(v_blob);
        END IF;
        IF utl_file.is_open(file => v_file) THEN
          utl_file.fclose(file => v_file);
        END IF;
    END;

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    UTL_FILE n'a pas été prévu à l'origine pour gérer des fichiers binaire. A fortiori en utilisant PUT ou PUT_LINE.
    depuis la version 10g il existe la fonction PUT_RAW() qui ferait peut-être l'affaire...

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    Salut,
    merci pour ta réponse. Je vais voir comment on utilise put_raw().
    Si j'ai bien compris, il faut que je vire tous les utl_file?

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    J'ai à peu près compris. En fait, j'ai juste une ligne à changer dans ma procedure PL/SQL. Au lieu, de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utl_file.put(file => v_file, buffer => utl_raw.cast_to_varchar2(v_buffer));
    je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utl_file.put_raw(file => v_file, buffer => utl_raw.cast_to_raw(v_buffer),autoflush => false );
    Par contre, lorsque je fais ça le fichier image.JPG généré reste à 0 Ko.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/10/2008, 03h30
  2. taille fichier image
    Par djaouida27 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/06/2008, 11h21
  3. Modification de la taille des fichiers image
    Par GBAGO dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 29/08/2007, 10h16
  4. Réponses: 5
    Dernier message: 28/09/2006, 13h56
  5. Réponses: 1
    Dernier message: 20/08/2006, 11h30

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