Page 2 sur 2

Posté : mer. 03 févr. 2016, 16:14:29
par ROMJERIPA
Et bien c'est bon cela fonctionne à présent: EN SOAP ;-)

Je lis mon pdf généré sur l'IFS, j'appelle l'API de Scott KLEMENT BASE64 et je retourne la chaine convertie dans le paramètre en sortie du Web Service (RPGLE).

La chaîne retournée, une fois décodée peut être enregistrée au format PDF et être ouverte via Acrobat.

Je vais épurer mon source des différents tests effectués et je le posterai ici de façon à ce qu'il puisse éventuellement être utile à quelqu'un...

Merci

Posté : mer. 03 févr. 2016, 16:38:23
par ROMJERIPA
Voici donc un exemple du code


H DFTACTGRP(*NO)
H ACTGRP('SOAP') PGMINFO(*PCML: *MODULE)
F* ---------------------------------------------------------------
F* Ce programme:
F* - Est un programme SQLRPGLE déployé comme
F* Web Service SOAP via IBM Web Administration for i
F* ---------------------------------------------------------------
F* Ce programme (WS000RP)
F* - Est appelé par le Web Service SOAP
F* - Lis un fichier PDF stocké dans l'IFS (MonPDF.PDF)
F* - Encode ce fichier PDF en BASE64
F* - Retourne le fichier PDF dans une chaîne de caractère
F* au format BASE64
F* ---------------------------------------------------------------
// Répertoire de liage de l'API Scott KLEMENT BASE64
CTL-OPT BNDDIR('BASE64BND');
D* ---------------------------------------------------------------
D* Zones de travail
D* ---------------------------------------------------------------
DCL-S NOM_PDF VARCHAR(255);
*
* Variable pour appel de l'API BASE64
*
DCL-S WEncodeDataLen INT(10);
DCL-S WEncodeData CHAR(65535);
DCL-S WReadData CHAR(19998);
DCL-S WI INT(10);
DCL-S Wlen INT(10);
DCL-S WInFile INT(10);
*
/COPY QCPYSRC,BASE64_H
/COPY QCPYSRC,IFSIO_H
*
D* ---------------------------------------------------------------
D* Paramètres
D* ---------------------------------------------------------------
DCL-PR WS000RP extpgm('WS000RP');
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PR;

DCL-PI WS000RP;
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PI;
//-----------------------------------------------------------------------
// Initialisations
//-----------------------------------------------------------------------
exec sql set option commit = *none;

//-----------------------------------------------------------------------
// Ouverture du PDF depuis l'IFS via l'API IFSIO de S.KLEMENT
//-----------------------------------------------------------------------
NOM_PDF = '/IFS/MonPDF.pdf';
WInFile = OPEN(%Trim(NOM_PDF): O_RDONLY);
//-----------------------------------------------------------------------
// Encodage du PDF en Base64
// - lecture par bloc de 19998 octets ( %SIZE(WReadData)=19998 )
//-----------------------------------------------------------------------
Wlen = READ(WInFile: %ADDR(WReadData): %SIZE(WReadData));
DOW Wlen >= 1;

// Encodage en BASE64
WEncodeDataLen = base64_encode(
%ADDR(WReadData) // Données à encoder
:%Len(%trimr(WReadData)) // Longueur données à encoder
:%ADDR(WEncodeData) // Résultat de l'encodage
:%len(WEncodeData)); // Longueur des données encodées

// Alimentation du paramètre en retour WS_DOC_PDF
// avec la chaîne de caractères encodés en BASE64
WS_DOC_PDF = %Trim(WS_DOC_PDF)
+ %Subst(WEncodeData:1:WEncodeDataLen);

WI = WI + 1;
DSPLY WI;
WLen = READ(WInFile: %ADDR(WReadData): %Size(WReadData));
ENDDO;
CALLP CLOSE(WInFile);

// Fin Prog
*inlr = *on;

Posté : mer. 03 févr. 2016, 16:42:57
par ROMJERIPA
Bien entendu cette solution nécessite l'installation des API de Scott CLEMENT:

- BASE64 trouvée sur https://www.scottklement.com/base64/
- IFSIO_H trouvé sur https://www.scottklement.com/presentati ... ources.zip

Encore merci à CMASSE pour son attention et ses réponses...

Posté : mer. 03 févr. 2016, 17:21:20
par ROMJERIPA
Je viens de constater que mon source ne marche pas dans tous les cas...
Je poursuis mes recherches et reviens au plus vite pour mettre à jour ce post...

Merci

Posté : jeu. 04 févr. 2016, 15:48:08
par ROMJERIPA
Il manquait juste une ligne de réinitiallisation du tampon de lecture...

WReadData = '';

à placer avant la lecture (en fin de boucle DOW):
WLen = READ(WInFile: %ADDR(WReadData): %Size(WReadData));

Code : Tout sélectionner

H DFTACTGRP(*NO)
H ACTGRP('SOAP') PGMINFO(*PCML: *MODULE)
F* ---------------------------------------------------------------
F* Ce programme:
F* - Est un programme SQLRPGLE déployé comme
F* Web Service SOAP via IBM Web Administration for i
F* ---------------------------------------------------------------
F* Ce programme (WS000RP)
F* - Est appelé par le Web Service SOAP
F* - Lis un fichier PDF stocké dans l'IFS (MonPDF.PDF)
F* - Encode ce fichier PDF en BASE64
F* - Retourne le fichier PDF dans une chaîne de caractère
F* au format BASE64
F* ---------------------------------------------------------------
// Répertoire de liage de l'API Scott KLEMENT BASE64
CTL-OPT BNDDIR('BASE64BND');
D* ---------------------------------------------------------------
D* Zones de travail
D* ---------------------------------------------------------------
DCL-S NOM_PDF VARCHAR(255);
*
* Variable pour appel de l'API BASE64
*
DCL-S WEncodeDataLen INT(10);
DCL-S WEncodeData CHAR(65535);
DCL-S WReadData CHAR(19998);
DCL-S WI INT(10);
DCL-S Wlen INT(10);
DCL-S WInFile INT(10);
*
/COPY QCPYSRC,BASE64_H
/COPY QCPYSRC,IFSIO_H
*
D* ---------------------------------------------------------------
D* Paramètres
D* ---------------------------------------------------------------
DCL-PR WS000RP extpgm('WS000RP');
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PR;

DCL-PI WS000RP;
// Variable alimentée en retour avec le PDF au format BASE64
WS_DOC_PDF varchar(8386552:4);
END-PI;
//-----------------------------------------------------------------------
// Initialisations
//-----------------------------------------------------------------------
exec sql set option commit = *none;

//-----------------------------------------------------------------------
// Ouverture du PDF depuis l'IFS via l'API IFSIO de S.KLEMENT
//-----------------------------------------------------------------------
NOM_PDF = '/IFS/MonPDF.pdf';
WInFile = OPEN(%Trim(NOM_PDF): O_RDONLY);
//-----------------------------------------------------------------------
// Encodage du PDF en Base64
// - lecture par bloc de 19998 octets ( %SIZE(WReadData)=19998 )
//-----------------------------------------------------------------------
Wlen = READ(WInFile: %ADDR(WReadData): %SIZE(WReadData));
DOW Wlen >= 1;

// Encodage en BASE64
WEncodeDataLen = base64_encode(
%ADDR(WReadData) // Données à encoder
:%Len(%trimr(WReadData)) // Longueur données à encoder
:%ADDR(WEncodeData) // Résultat de l'encodage
:%len(WEncodeData)); // Longueur des données encodées

// Alimentation du paramètre en retour WS_DOC_PDF
// avec la chaîne de caractères encodés en BASE64
WS_DOC_PDF = %Trim(WS_DOC_PDF)
+ %Subst(WEncodeData:1:WEncodeDataLen);

WI = WI + 1;
DSPLY WI;

WReadData = '';
WLen = READ(WInFile: %ADDR(WReadData): %Size(WReadData));
ENDDO;
CALLP CLOSE(WInFile);

// Fin Prog
*inlr = *on;

base64

Posté : ven. 05 févr. 2016, 14:08:26
par cmasse
Excellent !


Le fichier en base64 doit-il être décodé du coté client avant d'être lu ou bien est-il lisible directement dans Acrobate sans traitement ?

Posté : mer. 30 mars 2016, 08:50:45
par ROMJERIPA
Il doit être décodé avant de pouvoir être ouvert via acrobat.

Re: Web Service SOAP avec BLOB

Posté : dim. 26 déc. 2021, 19:54:28
par Bilbao400
Bonjour,
Pour retourner un blob à l'aide d'un webservice, vous pouvez créer un webservice rest basé sur une procédure sql. Pour cela, vous devez créer une procédure sql ayant un paramètre de sortie de type blob. Exposez votre procédure sql à l'aide iws, spécifiez le type mime du blob retourné, application/pdf par exemple et le tour est joué !
Pour charger votre blob à partir d'un fichier présent sur l’ifs, utilisez la fonction sql get_blob_from_file

Re: Web Service SOAP avec BLOB

Posté : dim. 02 janv. 2022, 18:33:25
par nbonnet
Merci pour l'info !