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

Langage Delphi Discussion :

Ajout d'un fichier (raw) dans un JSON


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 42
    Points
    42
    Par défaut Ajout d'un fichier (raw) dans un JSON
    Bonjour,

    Je voudrais ajouter un fichier dans un JSON comme par exemple par exemple un PDF ou JPG, PNG,... Encodé de manière standard.

    Je n'ai actuellement rien trouvé

    Ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      a:= TJSONArray.Create;
      o:=TJSONObject.Create;
      o.AddPair('nom_fichier', 't:\Temp\abc.pdf');
      o.AddPair('data', LE_FICHIER_ICI_ENCODE);
      a.AddElement(o);

    Est-ce que quelqu'un pourrait m'aider?

    J'utilise D10.4.2.

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    En fait très simple
    Tu charges un composant avec ta data, tu sérialise cette data en utilisant les fonctions delphi WriteComponent et autres.
    Tu obtiens un fichier texte ascii que tu peux inclure dans ton ficher JSON
    et tu fais l'opération inverse pour régénérer ta data
    Je vais te préparer un petit exemple.
    C'est de cette manière que je travaille avec DataSnap

  3. #3
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    jette un coup d'oeil aux conventions en base64 (idéal car existant aussi sur les langages côté serveur) : http://docwiki.embarcadero.com/Libra...Base64Encoding

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par pprem Voir le message
    jette un coup d'oeil aux conventions en base64 (idéal car existant aussi sur les langages côté serveur) : http://docwiki.embarcadero.com/Libra...Base64Encoding
    Salut,

    En effet j'ai trouvé qqch un peu par hasard et comme tu le signales compatible côté client


    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
     
    var
      ImagePath: string;
      JsonObject: TJSONObject;
      inStream, outStream: TStream;
      StrList: TStrings;
      TempStream : TMemoryStream;
    Begin
      TempStream := TMemoryStream.Create;
      ImagePath:='d:\test.jpg';
      inStream := TFileStream.Create(ImagePath, fmOpenRead);
      try
        outStream := TFileStream.Create('final_file', fmCreate);
        JsonObject := TJSONObject.Create;
        try
          TNetEncoding.Base64.Encode(inStream, outStream);
          outStream.Position:=0;
          TempStream.LoadFromStream(outStream);
          // dans un fichier
          outStream.Position:=0;
          TempStream.SaveToFile('d:\test.json');
     
          // dans le mémo
          outStream.Position:=0;
          Memo1.Lines.LoadFromStream(outStream);
          JsonObject.AddPair('data', Memo1.Lines.Text);
     
        finally
          TempStream.Free;
          outStream.Free;
          JsonObject.DisposeOf;
        end;
      finally
        inStream.Free;
      end;
    end;

    Et on peut tester ici le fichier encodé pour le décoder ...

    https://base64.guru/converter/decode/file

    Merci pour tout


    Edit :
    J'utilise cela pour un TMemoryStream (une image eb blob)

    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
     
    Function StreamToBase64(inStream : TMemoryStream):String;
     
    // https://base64.guru/converter/decode/image
    function StreamToString(aStream: TStream): string;
    var
      SS: TStringStream;
    begin
      if aStream <> nil then
      begin
        SS := TStringStream.Create('');
        try
          SS.CopyFrom(aStream, 0);  // No need to position at 0 nor provide size
          Result := SS.DataString;
        finally
          SS.Free;
        end;
      end else
      begin
        Result := '';
      end;
    end;
     
    var
      outStream: TStream;
      encoding:TBase64Encoding;
    Begin
      outStream := TFileStream.Create('final_file', fmCreate);
      try
        encoding := TBase64Encoding.Create(0);
        try
          encoding.Encode(inStream, outStream);
        finally
          encoding.Free;
        end;
        outStream.Position:=0;
        Result := StreamToString(outStream);
      finally
        outStream.Free;
      end;
    End;
    Cela fonctionne parfaitement...

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Voici un exemple pour sérialiser une donnée binaire inspirée des outils delphi fmx liés au mesh
    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
     
    var
      MS1,MS2 : TMemoryStream ;
      b1 : byte ;
      arb1 : array [0..1] of byte ;
      st1 : string ;
      i1 : integer ;
    begin
      // Codage
      MS1 := TMemoryStream.Create ;
      MS1.LoadFromFile('W1.PDF');
      MS2 := TMemoryStream.Create ;
      MS2.SetSize(MS2.Size*2);
      MS1.Position := 0 ;
      for i1 := 1 to MS1.Size do
      begin
        ms1.Read(b1,1);
        st1 := intToHex (b1,2) ;
        arb1[0] := ord(st1[1]) ;
        arb1[1] := ord(st1[2]) ;
        ms2.Write(arb1,2) ;
      end;
      MS2.SaveToFile('W1.TXT');
      MS2.Free ;
      MS1.Free;
      // décodage
      MS1 := TMemoryStream.Create ;
      MS1.LoadFromFile('W1.TXT');
      MS2 := TMemoryStream.Create ;
      MS2.SetSize(MS2.Size div 2);
      MS1.Position := 0 ;
      for i1 := 1 to MS1.Size do
      begin
        ms1.Read(arb1,2) ;
        st1 := '$'+chr(arb1[0])+chr(arb1[1]) ;
        b1 := st1.ToInteger ;
        ms2.Write(b1,1);
      end;
      MS2.SaveToFile('W2.PDF');
      MS2.Free ;
      MS1.Free;
    end;

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Concernant TNetEncoding.Base64, si les retours chariot ajouté par défaut pour faire des lignes de 76 chars comme dans ce sujet, on peut instancier un TBase64Encoding en indiquant 0 comme paramètre à CharsPerLine Création d'un body JSON avec TRESTRequest, delphi 10.3: TRESTClient+TRESTRequest+TJSONObject+TBase64Encoding.
    On ne sait jamais selon le client si les CRLF peuvent poser problème sur une chaine Base64 au sein de la chaine JSON
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Concernant TNetEncoding.Base64, si les retours chariot ajouté par défaut pour faire des lignes de 76 chars comme dans ce sujet, on peut instancier un TBase64Encoding en indiquant 0 comme paramètre à CharsPerLine Création d'un body JSON avec TRESTRequest, delphi 10.3: TRESTClient+TRESTRequest+TJSONObject+TBase64Encoding.
    On ne sait jamais selon le client si les CRLF peuvent poser problème sur une chaine Base64 au sein de la chaine JSON

    En effet, c'est ce que j'ai eu. Le code a été modifié dans la 2ème partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Var
      encoding:TBase64Encoding;
    ...
    
        encoding := TBase64Encoding.Create(0);
        try
          encoding.Encode(inStream, outStream);
        finally
          encoding.Free;
        end;
    Merci pour tout.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/11/2019, 10h45
  2. [PowerShell] Ajouter Users depuis fichier csv dans un Groupe
    Par Eddy1 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 12/11/2013, 10h09
  3. Réponses: 1
    Dernier message: 22/04/2008, 11h24
  4. [MFC] Ajout des fichiers récents dans un menu
    Par Choupinou dans le forum MFC
    Réponses: 3
    Dernier message: 20/08/2004, 16h47
  5. [Fichier] Ajout des lignes de doc dans arraylist
    Par 3adoula dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 29/04/2004, 22h41

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