【问题标题】:Convert large file to base64 with Delphi使用 Delphi 将大文件转换为 base64
【发布时间】:2017-09-25 18:33:24
【问题描述】:

我需要将文件从 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;

【问题讨论】:

  • 使用 TFilestream 代替 TMemorystream...
  • ty,但没有解决。 [链接]paste.ofcode.org/HTkqhJyu8bUPb4ESU8VEH7 [/链接]
  • 尝试 LStream.Position := 0;在 LoadFromFile 之后。
  • 同样的问题。内存不足
  • @William 生成的 base64 字符串在 D2007 及更早版本中为 573MB,在 D2009 及更高版本中为 1GB。字符串限制为 MaxInt(约 20 亿)个最大字符或可用内存,以较小者为准。但也要记住,数据首先被编码为一个中间字节数组,因此在准备最终字符串时还有另外 573MB 正在使用。

标签: delphi base64 string-conversion


【解决方案1】:

您不应将整个 Base64 字符串保存在内存中。 480 MB 编码为 Base64 将产生大约 640 M 字符,占用大约 1.28 GB 内存。这在 32 位应用程序中肯定会失败。

最好将编码后的字符串写入文件并为此使用适当的编码器。最近的 Delphi 版本为此提供了 System.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;

【讨论】:

  • 输出文本会使用 ASCII 字符,而不是 UTF-16 编码吗?
  • @ArnaudBouchez,纯 ASCII。编码仅适用于字节,因此此处不涉及字符串。
猜你喜欢
  • 2017-07-23
  • 2015-09-18
  • 1970-01-01
  • 2015-04-29
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多