Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Dans l'utilisation d'un web service, j'ai besoin de récupérer un fichier encodé en base64, afin de le rapatrier en local et de l'ouvrir (il s'agit en fait d'un fichier pdf).
en dot.net cela s'écrit
byte[] binaryData = null; binaryData = Convert.FromBase64String(pageResultsReply.PageResults.Data[0].Value);
puis
System.IO.FileStream outFile = new System.IO.FileStream('c:\\test.pdf", System.IO.FileMode.Create, System.IO.FileAccess.Write); outFile.Write(binaryData, 0, binaryData.Length); outFile.Close();
Mais voilà, comment je traduit cela en PB ?
Merci d'avance,
PB version 12.1
Hors ligne
Bonjour,
les manipulations de binaires sont très lentes avec PB
Quand j'ai eu besoin de faire l'inverse de ton cas (c'est à dire envoyer un fichier à un Webservice) je suis passé par un OLE XMLDOM
string ls_retour blob lblb_fichier long ll_fp oleobject loo_xml, loo_tmp loo_xml = CREATE oleobject loo_xml.connectToNewObject("Microsoft.XMLDOM") ll_fp = fileOpen(ls_chemin,StreamMode!,Read!,Shared!) fileReadEx(ll_fp,lblb_fichier) fileClose(ll_fp) loo_tmp = loo_xml.createElement("tmp") loo_tmp.datatype = "bin.base64" loo_tmp.nodeTypedValue = lblb_fichier ls_retour = string(loo_tmp.text) loo_xml.disconnectObject() DESTROY loo_xml
En gros dans ton cas il faut faire l'inverse (je n'ai pas testé mais ça doit être possible)
Sinon dans la dernière application que je suis en train de faire je me suis mis à faire des objets COM Visible en .net que j'instancie dans PB
Exemple en VB.net
Namespace MyVBHelpers <ComVisible(True)> _ <ProgId("MyVBHelpers.PictureHandler")> _ <ClassInterface(ClassInterfaceType.AutoDual)> _ Public Class PictureHandler Public Function CreerMiniature(ByVal blob As Byte(), ByVal largeur As Int32, ByVal hauteur As Int32, ByVal formatSource As String) As Byte() Dim miniature As Byte() = New Byte() {} ' du traitement... GC.Collect() Return miniature End Function
Il faut enregistrer la dll VB.net avec regasm
puis dans PB
oleobject loo_ph blob lblb_miniature loo_ph = CREATE oleobject loo_ph.ConnectToNewObject("MyVBHelpers.PictureHandler") lblb_miniature = loo_ph.CreerMiniature(ablb_fichier,210,297,as_extension) ...
sachant que dans ton cas il ne s'agit pas de créer une miniature mais tout simplement d'écrire le fichier. c'est juste un exemple pour te montrer comment faire.
Sinon il me semble avoir vu passé une librairie PBNI pour les binaires ( http://pbadonf.fr/forum/viewtopic.php?id=3882 ).
Hors ligne
Sinon, il y aussi : http://pbadonf.fr/forum/viewtopic.php?id=1905
Hors ligne
erasorz a écrit:
Sinon, il y aussi : http://pbadonf.fr/forum/viewtopic.php?id=1905
Semble plus simple et moins lourd que l'objet COM.
Le seul point où j'accroche c'est pour
décompresser l'archive et copier Base64.dll dans c:\windows\system32
c'est quand même plus propre de ne pas polluer les répertoires système et de conserver base64.dll avec le reste de l'application (le regsvr32 reste valable ailleurs que dans system32)
Hors ligne
seki a écrit:
erasorz a écrit:
Sinon, il y aussi : http://pbadonf.fr/forum/viewtopic.php?id=1905
Semble plus simple et moins lourd que l'objet COM.
Le seul point où j'accroche c'est pourdécompresser l'archive et copier Base64.dll dans c:\windows\system32
c'est quand même plus propre de ne pas polluer les répertoires système et de conserver base64.dll avec le reste de l'application (le regsvr32 reste valable ailleurs que dans system32)
Mouais, un fichier de 32ko de plus dans le fatras Windows...
J'avais suggéré dans system32 vu que la plupart de ce genre de DLL sont placées ici, mais après chacun le met où il veut
Hors ligne
Bonjour,
Merci pour vos réponses, j'ai trouvé aussi cela lien pour base64
Je vous tiens au courant, mais du coup quelle méthode choisir, y'a-t-il une préférence ?
Merci
Hors ligne
Bonjour,
Pour ma part, j'utilise la méthode of_decode64 disponible dans l'objet n_winsock de EmailSMTP téléchargeable sur : http://www.topwizprogramming.com/freeco … lsmtp.html
Cette méthode implémente effectivement l'appel à la fonction de l'API : CryptStringToBinary telle que tu le décris dans ton lien.
Hors ligne
Bonjour,
Les 2 méthodes fonctionnent correctement, et dans les 2 cas il faut enregistrer une dll.
Par contre, je n'obtiens pas le résultat attendu.
En fait, le fichier que je cherche à récupérer est sous la forme d'une chaîne de bytes dans une zone sous forme de string, le tout encodé en base64
Comme je le disais au début de ce post, en dot.net cela s'écrit simplement comme cela
byte[] binaryData = null; binaryData = Convert.FromBase64String(ma_valeur);
Sauf que dans PB, je ne sais pas comment interpréter le code si dessus.
Savez-vous comment je peux solutionner mon problème ?
Merci d'avance,
Hors ligne
-> DecodeToFile
Hors ligne
erasorz a écrit:
-> DecodeToFile
Je ne comprend pas la réponse (ou alors je suis très fatiguée), c'est quoi DecodeToFile ? En PB bien sur
Merci d'avance,
Hors ligne
wazou1812 a écrit:
erasorz a écrit:
-> DecodeToFile
Je ne comprend pas la réponse (ou alors je suis très fatiguée), c'est quoi DecodeToFile ? En PB bien sur
Merci d'avance,
ok, j'ai compris, j'essaye la solution
merci
Hors ligne
wazou1812 a écrit:
wazou1812 a écrit:
erasorz a écrit:
-> DecodeToFile
Je ne comprend pas la réponse (ou alors je suis très fatiguée), c'est quoi DecodeToFile ? En PB bien sur
Merci d'avance,ok, j'ai compris, j'essaye la solution
merci
DecodeToFile avec la dll Base64.dll , mais c'est bien sur, ça marche du feu de dieu
Merci à tous et bon week end Pascal, et n'oubliez pas de changer d'heure dimanche matin, c'est l'heure d'été.
Hors ligne