Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Archivo a Base64 y viceversa probado en Android y Windows (https://www.clubdelphi.com/foros/showthread.php?t=96647)

dani36652 14-03-2024 00:07:39

Archivo a Base64 y viceversa probado en Android y Windows
 
Hola a todos compañeros del foro.
Les comparto las siguientes funciones para que las utilicen como mejor les convenga.

Código Delphi [-]
function FileToBase64(aFilePath: string): string;
var
  FileStream: TFileStream;
  Encoding: TNetEncoding;
  Buffer: TBytes;
begin
  {
    Función que convierte cualquier archivo a Base64
    pidiendo su ruta como parámetro
  }
  FileStream := TFileStream.Create(aFilePath, fmOpenRead);
  Encoding := TNetEncoding.Base64;
  try
    try
      SetLength(Buffer, FileStream.Size);
      FileStream.ReadBuffer(Buffer[0], FileStream.Size);
      Result := Encoding.EncodeBytesToString(Buffer);
    except
      Result:= string.Empty;
    end;
  finally
    FreeAndNil(FileStream);
    SetLength(Buffer, 0); //Liberar en memoria (importante)
  end;
end;


Código Delphi [-]
function Base64ToFile(Base64String, FilePath: string): boolean;
var
  Encoding: TNetEncoding;
  DecodedBytes: TBytes;
  FileStream: TFileStream;
begin
  {
    Función que convierte un Base64 a un archivo
    pidiendo el string en Base64 y la ruta completa del archivo
    por ejemplo C://users/Dani/Desktop/miArchivo.jpg
  }
  FileStream := TFileStream.Create(FilePath, fmCreate);
  Encoding := TNetEncoding.Base64;
  try
    try
      DecodedBytes := Encoding.DecodeStringToBytes(Base64String);
      FileStream.WriteBuffer(DecodedBytes[0], Length(DecodedBytes));
      Result:= True;
    except on E: exception do
      begin
        Result:= False;
      end;
    end;
  finally
    FreeAndNil(FileStream);
    SetLength(DecodedBytes, 0);
  end;
end;


Código Delphi [-]
function Base64ToMemoryStream(Base64String: string): TMemoryStream;
var
  Encoding: TNetEncoding;
  DecodedBytes: TBytes;
  FileStream: TFileStream;
begin
  {
    Esta función convierte una cadena en Base64 a un
    TMemoryStream
  }
  Encoding:= TNetEncoding.Base64;
  try
    try
      DecodedBytes:= Encoding.DecodeStringToBytes(Base64String);
      Result:= TMemoryStream.Create;
      Result.WriteBuffer(DecodedBytes[0], Length(DecodedBytes));
    except
      Result:= nil;
    end;
  finally
    SetLength(DecodedBytes, 0);
  end;
end;


Estas funciones podrían ser de utilidad por ejemplo para enviar archivos mediante aplicaciones Cliente-Servidor, un WS para registro de usuarios con fotos, etc.
El código fue escrito en Delphi 11.3 y probado en Android 13 y Windows 10.
Las unidades que deberán agregar al uses son:
System.NetEncoding y System.IOUtils;

Saludos.

Casimiro Notevi 14-03-2024 10:04:26

^\||/^\||/^\||/

Neftali [Germán.Estévez] 18-03-2024 10:29:53

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 23:39:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi