Deberias abstraerte de la nocion de que tu base64 esta en un campo de una base de datos. A fin de cuentas, no cambia nada, tenes siempre un TStream
Existen que yo sepa tres alternativas que vienen de fabrica con Delphi para trabajar con Base64:
uses
System.SysUtils,
System.Classes,
System.NetEncoding,
Soap.EncdDecd,
IdCoderMIME,
Data.DB;
// usando System.NetEncoding
function DecodeStreamNetEncoding(BlobStream: TStream): TStream;
var
Decoder: TNetEncoding;
begin
Result := TMemoryStream.Create;
BlobStream.Position := 0;
Decoder := TNetEncoding.Base64;
try
Decoder.Decode(BlobStream, Result);
finally
Decoder.Free;
end;
end;
// usando Indy (unidad IdCoderMIME)
function DecodeStreamIndy(BlobStream: TStream): TStream;
var
BlobStringSteram: TStringStream;
Base64: string;
begin
BlobStringSteram := TStringStream.Create;
try
BlobStream.Position := 0;
BlobStringSteram.CopyFrom(BlobStream, BlobStream.Size);
Base64 := TIdDecoderMIME.DecodeString(BlobStringSteram.DataString);
Result := TStringStream.Create(Base64);
finally
BlobStringSteram.Free;
end;
end;
// usando Soap.EncdDecd
function DecodeStreamEncdDecd(BlobStream: TStream): TStream;
var
Base64: TBytes;
BlobStringSteram: TStringStream;
begin
BlobStringSteram := TStringStream.Create;
try
BlobStream.Position := 0;
BlobStringSteram.CopyFrom(BlobStream, BlobStream.Size);
Base64 := DecodeBase64(BlobStringSteram.DataString);
Result := TStringStream.Create(Base64);
finally
BlobStringSteram.Free;
end;
end;
Para obtener el blob como stream de un determinado campo podes usar una sencilla funcion:
function GetBlobStream(Field: TBlobField): TStream;
begin
Result := TMemoryStream.Create;
Field.SaveToStream(Result);
end;
La otra posibilidad es que tengas problemas con el Encoding. El tipo de datos "string" a secas no existe mas. Lo que tenes es un arreglo de caracteres que estan codificados usando un Encoding (UTF8, ANSI, ASCII,etc). Si no especificas el Encoding adecuado, podes tener perdida de informacion y eso te genera errores al convertir desde/hacia Base64
Para ese punto si te va a interesar el collate del campo en la BD y tambien como lo tratas en el codigo. Por que usas WideStrnig en tu funcion?
Editado por Agustin Ortu, 19 diciembre 2016 - 01:35 .