Конвертируйте большой файл в base64 с Delphi


Мне нужно конвертировать файл из 480mb в base64, но я не могу. Я всегда получаю из памяти сообщения. У кого-нибудь есть предложения?

function TFormService.LoadFileToBase64(const AFileName: string): String;
var
//  stream: TMemoryStream;
  Encoder: TIdEncoderMIME;
  Base64String: String;
  LStream: TMemoryStream;
begin
  Encoder := TIdEncoderMIME.Create;
  LStream := TMemoryStream.Create;
  try
    LStream.LoadFromFile(AFileName);
    Base64String := Encoder.Encode(LStream);
  finally
    FreeAndNil(Encoder);
    FreeAndNil(LStream);
  end; // try finally


//  stream := TMemoryStream.Create;
//  try
//    stream.LoadFromFile(AFilename);
//    result := EncodeBase64(stream.Memory, stream.Size);
//  finally
//    stream.Free;
//  end;
end;
1 3

1 ответ:

Не следует хранить всю строку Base64 в памяти. 480 МБ, закодированных в Base64, дадут около 640 м символов, которые занимают около 1,28 ГБ памяти. Это неизбежно приведет к сбою в 32-битном приложении.

Лучше записать закодированную строку в файл и использовать для этого соответствующий кодер. Последние версии Delphi имеют систему .NetEncoding для этого:

procedure ConvertFileToBase64(const AInFileName, AOutFileName: string);
var
  inStream: TStream;
  outStream: TStream;
begin
  inStream := TFileStream.Create(AInFileName, fmOpenRead);
  try
    outStream := TFileStream.Create(AOutFileName, fmCreate);
    try
      TNetEncoding.Base64.Encode(inStream, outStream);
    finally
      outStream.Free;
    end;
  finally
    inStream.Free;
  end;
end;