Enregistrement d'une chaîne base64 sur le disque en tant que binaire en utilisant Delphi 2007
-
22-08-2019 - |
Question
J'ai une chaîne binaire base64 qui fait partie d'un document XML qui nous est envoyé par un fournisseur 3ème partie, je voudrais pouvoir l'enregistrer dans son format de fichier d'origine (jpg).
En utilisant la réponse acceptée de cette question « enregistrement d'une chaîne de base64 sur le disque en tant que binaire en utilisant php » je peux enregistrer la chaîne en jpg avec peu d'effort, donc je sais que la chaîne est en bonne forme et est un fichier JPG.
Mais comment dois-je faire cela en Delphi 2007?
Recherche sur le net, j'ai trouvé un tutoriel sur la façon de convertir base64 en TByteDynArray et sauver, mais il ne fonctionne pas bien. J'ai aussi joué environ avec IdDecoderMIME d'Indy, mais sans succès.
Est-ce que quelqu'un sait comment faire, ou si je devrais regarder?
La solution
OmniXMLUtils.pas du OmniXML projet contient des fonctions suivantes:
function Base64Decode(encoded, decoded: TStream): boolean; overload;
function Base64Decode(const encoded: string; decoded: TStream): boolean; overload;
function Base64Decode(const encoded: string; var decoded: string): boolean; overload;
function Base64Decode(const encoded: string): string; overload;
procedure Base64Encode(decoded, encoded: TStream); overload;
procedure Base64Encode(decoded: TStream; var encoded: string); overload;
function Base64Encode(decoded: TStream): string; overload;
function Base64Encode(const decoded: string): string; overload;
procedure Base64Encode(const decoded: string; var encoded: string); overload;
Le Base64Decode (string, TStream) devrait faire l'affaire. Pour le paramètre TStream vous pouvez passer TFileStream comme ceci:
procedure SaveBase64ToFile(const encoded, fileName: string);
var
fs: TFileStream;
begin
fs := TFileStream.Create(fileName, fmCreate);
try
if not Base64Decode(encoded, fs) then
raise Exception.Create('Invalid data!');
finally FreeAndNil(fs); end;
end;
Autres conseils
La bibliothèque Direct Internet (Indy) contient des classes dans IdCoderMIME.pas qui prennent en charge l'encodage base64 et sont faciles à utiliser. TIdEncoderMIME et TIdDecoderMIME