Конвертируйте большой файл в 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 ответ:
Не следует хранить всю строку 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;