【问题标题】:Indy's TIdMultipartFormDataStream weird behavior on Delphi XE5/Android platformIndy 在 Delphi XE5/Android 平台上的 TIdMultipartFormDataStream 奇怪行为
【发布时间】:2013-11-11 20:05:52
【问题描述】:

我正在尝试使用 Indy 的 TIdHTTP 组件将数据发送到网站。 该代码在 Windows 平台上完美运行,但不幸的是它在 Android 平台上表现异常。当我使用 TIdMultipartFormDataStream 发送 POST 参数时出现问题。

在 Android 平台上 TIdMultipartFormDataStream 的行为很奇怪,这会发生什么: 假设您的 POST 数据是 myparam=myvalue,其中“myparam”是参数名称,“myvalue”是参数值。

参数值更改为 {FIRST CHARACTER REMOVED}yvalue{NULL CHARACTER},因此最终输出将类似于 yvalue\x00,其中 \x00 是空字符。

我可以用 TStringList 替换 TIdMultipartFormDataStream,我不会遇到这样的问题,但我更喜欢使用 TIdMultipartFormDataStream,因为它使我能够同时上传文件和发送 POST 数据。

示例代码:

procedure HTTPPOST;
var
  HTTP: TIdHTTP;
  POSTData: TIdMultipartFormDataStream;
begin
  HTTP := TIdHTTP.Create(nil);
  POSTData := TIdMultipartFormDataStream.Create;

  try
    POSTData.AddFile('myfile','file.txt'); // works
    POSTData.AddFormField('username', 'user1'); // On Android the value gets changed to ser1\x00 where \x00 = Null character

    HTTP.Post('http://www.example.com', POSTData)

  finally
    POSTData.Free;
  end;
end;

注意:代码是使用 Delphi XE5 和 Delphi XE5 Update 1 测试的

【问题讨论】:

    标签: android delphi indy10 delphi-xe5


    【解决方案1】:

    你所描述的听起来像是一个ZEROBASEDSTRINGS 错误,它不应该存在于当前的 SVN 版本中,因为 Indy 在 XE4 中不断遭受大量 ZBS 错误之后,在其所有单元中全局禁用了ZEROBASEDSTRINGS。所以我建议你升级到最新的 SVN 版本。如果您在执行此操作时遇到问题,请更新您的问题并详细说明原因

    【讨论】:

    • 我尝试编译的是来自indy.fulgan.com 的ZIP 版本,它似乎有问题。我已经尝试过 SVN 版本并且没有遇到同样的问题,我能够为 Android 平台编译 Indy,尽管它不像为 Windows 平台编译它那样直接。我最终以肮脏的方式安装它,它可以正常工作。谢谢雷米:)
    • Fulgan zip 每晚都会更新最新的 SVN 代码。
    【解决方案2】:

    工作..

    procedure HTTPPOST;
        var
          HTTP: TIdHTTP;
          POSTData: TIdMultipartFormDataStream;
        begin
          HTTP := TIdHTTP.Create(nil);
          POSTData := TIdMultipartFormDataStream.Create;
    
          try
            POSTData.AddFile('myfile','file.txt'); // works
            POSTData.AddFormField('username', UTF8Encode('user1'), 'utf-8').ContentTransfer:= '8bit';
    
            HTTP.Post('http://www.example.com', POSTData)
    
          finally
            POSTData.Free;
          end;
        end;
    

    【讨论】:

    • 嗨,欢迎来到堆栈溢出。由于这是一个相对较老的问题,您能否提供一些有关此解决方案为何有效的额外信息?
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多