You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中TNetEncoding.Base64编码数据被截断的原因咨询

问题:Base64转换PDF文件时数据被截断

我编写了一段使用TNetEncoding.Base64将文件转换为Base64格式的代码,代码可运行但数据被截断为几行。我对此感到疑惑:Delphi的String类型可容纳约2^30个字符(即2GB数据),为何无法正常处理大小约3-6MB的PDF文件?该Base64字符串后续将存入SQL数据库。代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
  inp: String;
  s: string;
begin
  try
    if OpenDialog1.Execute then
      if FileExists(OpenDialog1.FileName) then
      begin
        Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
        s := TNetEncoding.Base64.Encode(Memo1.Lines.Text);
      end;

    memo1.Lines.Text := s;
  except
    ShowMessage('error');
  end;
end;

问题原因

  • 二进制文件被误当文本处理:PDF属于二进制格式文件,Memo1.Lines.LoadFromFile会按文本编码解析文件内容,遇到无法识别的非文本字符时会提前终止读取,导致原始数据在加载阶段就被截断,后续Base64编码自然不完整。
  • Memo控件的设计局限:Memo控件是用于展示文本内容的UI组件,本身对可承载的内容长度有隐性限制,并不适合作为大二进制文件的临时存储容器。

修正方案

直接读取文件的二进制字节流进行Base64编码,跳过Memo控件的中间处理步骤,代码如下:

uses
  System.IOUtils, System.NetEncoding;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileBytes: TBytes;
  Base64Str: string;
begin
  try
    if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then
    begin
      // 直接读取文件二进制内容
      FileBytes := TFile.ReadAllBytes(OpenDialog1.FileName);
      // 编码为Base64字符串
      Base64Str := TNetEncoding.Base64.Encode(FileBytes);
      
      // 如需预览可写入Memo(大文件可能导致UI卡顿,建议仅用于测试)
      Memo1.Lines.Text := Base64Str;
      // 后续可将Base64Str直接存入SQL数据库
    end;
  except
    on E: Exception do
      ShowMessage('错误:' + E.Message);
  end;
end;

内容的提问来源于stack exchange,提问作者milenjao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:43:34