PDA

View Full Version : BLOB mit BASE64 encoden für REST Service im IBM i IWS



ismiavoiwuascht
25-04-20, 10:18
Hallo zusammen

Ich habe die Anforderung aus einem BLOB Feld einer AS400 Tabelle, welches ein Programmobjekt für eine Android App beinhält (ca. 5 MB), mittels REST Service über den IBM i integrated web services server, dieses als BASE64 String zur Verfügung zu stellen.

Grundsätzlich dachte ich, das mit folgendem SQL zu machen, aber das funktioniert leider nicht, da der BLOB Inhalt zu groß ist. SYSTOOLS.BASE64ENCODE ist auf 2732 Zeichen beschränkt.:rolleyes:


Select cast(systools.base64encode(Datei) AS clob ccsid 1208) as Datei from Versionsverwaltung
where programm = 'StaplerTerminal.apk' and versionsnr = '1.0.5';

Daher war dann mein Ansatz, das BLOB Feld in einem CLOB (CCSID 1208) als BASE64 zu speichern. Dies wollte ich mittels apr_base64_encode_binary bewerkstelligen. Die Funktion habe ich aus einem Foreneintrag übernommen. Nur komme ich auf keinen grünen Zweig, da ich, egal was ich anstelle, immer falsche BASE64 Daten erzeuge.



dcl-s Blob sqltype(BLOB:16773100);
dcl-s Clob sqltype(CLOB:16773100) CCSID(1208);
dcl-s DateiClob sqltype(CLOB:16773100) CCSID(1208);
dcl-s ClobOut sqltype(CLOB:16773100) CCSID(1208);
dcl-s LocString like(Clob);
dcl-s LocBase64 like(Clob);

exec sql
select datei into :Blob,
from Versionsverwaltung
where programm = trim(:Programm) and versionsnr = trim(:Version)
limit 1;

if sqlcode = 0;
ClobOut = getBase64(Blob);
ClobOut_Len = %len(%trimr(ClobOut));
exec sql
update Versionsverwaltung set DateiClob = :ClobOut
where aktuell='1' and
where programm = trim(:Programm) and versionsnr = trim(:Version);
endif;

*inlr = *on;
return;

// __________________________________________________ _____________
// getBASE64 Encoded String ____________________________________

dcl-proc getBase64;
dcl-pi *n like(Clob) rtnparm; // Encoded String
PiString like(Blob);
end-pi;

dcl-s LocString like(Blob) inz; // Source String
dcl-s LocBase64 like(Clob) inz; // Encoded String
dcl-s Loclength int(10); // StringLength
dcl-s LocEnclen int(10); // EncodedLength

LocString = %trimr(PiString);
LocLength = %len(%trimr(LocString)); // String-Length

LocEnclen = encbase64bin(%addr(LocBase64): // Encode Base64
%addr(LocString):LocLength);

if LocEnclen > *zero; // Encoded Length
return %subst(LocBase64:1:LocEnclen - 1);// without last null
else;
return *blanks;
endif;

end-proc;


Hat jemand eine Idee, was ich hier falsch mache oder ist meine Herangehensweise falsch? Bin für jeden Tipp dankbar.

Grüße, Ingo