Indy在Delphi XE5 / Android平台上的TIdMultipartFormDataStream怪异行为

时间:2013-11-11 20:05:53

标签: android delphi indy10 delphi-xe5

我正在尝试使用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测试代码

2 个答案:

答案 0 :(得分:1)

您所描述的内容听起来像ZEROBASEDSTRINGS错误,在当前的SVN版本中不应该存在,因为Indy在XE4中遭受大量ZBS错误后,会在其所有单元中全局禁用ZEROBASEDSTRINGS 。所以我建议你升级到最新的SVN版本。如果您遇到问题,请更新您的问题,并提供解释原因的详细信息

答案 1 :(得分:0)

作品..

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;