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

Bases de données Delphi Discussion :

Progression BLOB


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Par défaut Progression BLOB
    Bonjour a tous !

    J'ais une application qui doit uploader des photo (env 700 ko chacune) dans une base de donnée Firebird distante (au travers d'un VPN).
    Le problème est que cette opération prends du temps et l'utilisateur doit resté informé de l'avancé de l'upload (l'upload prends environs 3 mn).

    Comment faire pour connaitre la progression de l'envois de l'image dans le blob lors du Commit ? :

    Merci d'avance,

    Romain T.

  2. #2
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    Je ne vois pas de solution simple... mais ce n'est pas ma spécialité il faut dire
    Peut être pourait tu utiliser le principe du Packet ?

    Tu découpe ton up en packet de 100Ko... et tu informe sur le nombre de packet émis...

    Enfin... c'est ce que j'en dis...

  3. #3
    Rédacteur

    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    "... lors du Commit ?" du submit tu veux dire.

    Pour avoir une solution, il faudrait savoir avec quoi l'upload se fait.
    Par exemple le client upload avec un navigateur vers une dll isapi...

  4. #4
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Par défaut
    Pour ceux que ca intéresse, j'ais trouvé uné méthode pour la progression.

    En fait, c qui est long, c'est le SaveToStream du TBlobField.
    J'ais donc créé une classe TBlobFieldEx avec SaveToStream overloadé.
    Ca nécéssite aussi la création d'un TStreamEx avec un callback pour la progression sur le CopyFrom. (merci les DCU de déboguage).

    Voila le source des classes...


    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    unit StreamEx;
     
    interface
     
    Uses
       Windows, Classes,
       DB;
    type
    TStreamEx = class(TMemoryStream)
        private
           FOnProgress : TNotifyEvent;
           procedure Progress(Sender : TObject);
        public
           property OnProgress : TNotifyEvent Read FOnProgress Write FOnProgress;
           function CopyFrom(Source: TStream; Count: Int64): Int64;overload;
           constructor Create();
    end;
     
    TBlobFieldEx = class(TBlobField)
        procedure SaveToStream(Stream: TStreamEx);overload;
    end;
     
    implementation
     
     
    function TStreamEx.CopyFrom(Source: TStream; Count: Int64): Int64;
    Const
      MaxBufSize = $F000;
    Var
      BufSize, N : Integer;
      Buffer : PChar;
    Begin
      If Count = 0 Then
      Begin
        Source.Position := 0;
        Count := Source.Size;
      End;
      Result := Count;
      If Count > MaxBufSize Then
        BufSize := MaxBufSize
      Else
        BufSize := Count;
      GetMem(Buffer, BufSize);
      Try
        While Count <> 0 Do
        Begin
          If Count > BufSize Then
            N := BufSize
          Else
            N := Count;
          Source.ReadBuffer(Buffer^, N);
          WriteBuffer(Buffer^, N);
          Dec(Count, N);
          // A chaque buffer copié, Progress est appelée
          Progress(Self);
        End;
      Finally
        FreeMem(Buffer, BufSize);
      End;
     
     
    end;
     
    constructor TStreamEx.Create;
    begin
     
    end;
     
    procedure TStreamEx.Progress(Sender: TObject);
    begin
    if Assigned(FOnProgress) then
       FOnProgress(Sender);
    end;
     
    { TBlobFieldEx }
     
    procedure TBlobFieldEx.SaveToStream(Stream: TStreamEx);
    var
      BlobStream: TStream;
    begin
      BlobStream := DataSet.CreateBlobStream(Self, bmRead);
      try
        Stream.CopyFrom(BlobStream, 0);
      finally
        BlobStream.Free;
      end;
    end;
    end.
    [Balise ajoutée par King Kaiser]

  5. #5
    Membre expérimenté
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Par défaut
    Je serait pour que tu la propose dans la section Code Source
    Et la prochaine foit panse a la balise Code et surdout a édenté ton code

  6. #6
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Citation Envoyé par /dev/null
    Je serait pour que tu la propose dans la section Code Source
    +1

    Il faut fournir le zip contenant un exemple
    Pour la rubrique code sources, c'est ici :
    http://www.developpez.net/forums/viewtopic.php?t=195625

    A+

Discussions similaires

  1. Blob (interbase) d'une Database à l'autre
    Par TOM-Z dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/05/2003, 21h57
  2. faire un insert pour un champ blob
    Par tripper.dim dans le forum InterBase
    Réponses: 10
    Dernier message: 02/05/2003, 16h56
  3. BLOB et INSERT
    Par Thomad dans le forum Débuter
    Réponses: 3
    Dernier message: 25/04/2003, 15h32
  4. [Progress] Odbc
    Par NewB dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 26/03/2003, 09h19

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