Ver Mensaje Individual
  #1  
Antiguo 14-03-2024
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 61
Reputación: 6
dani36652 Va camino a la fama
Lightbulb 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.
Responder Con Cita