你能用TIdHTTP将帖子发送到网站吗?

时间:2013-06-21 18:15:39

标签: delphi http post indy

我有一个程序充当Web服务器和用户之间的接口,允许用户将文件上传到Web服务器。当用户点击“上传”时,它从列表视图中获取信息并将其发送到网站,第一个http.Post用于实际文件,第二个用于我存储的元数据。

当我评论出第一个Post语句时它工作正常并实际发布数据,但是当它们都在那里时它似乎没有获得第二个的任何参数。当我在Web浏览器中使用Param中的值运行脚本时,它也可以工作。

UFile是包含文件元数据的记录。

  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create;
  http := TIdHTTP.Create(nil);
  http.IOHandler := IOHandler;
  Param := TStringList.Create;
  DataParams := TIdMultiPartFormDataStream.Create;
  Stream := TStringStream.Create('');
  DebugStream := TStringStream.Create('');

  Param.Add('serial='+UFile.Serial);
  Param.Add('filename='+UFile.Name);
  Param.Add('filepath='+'\'+UFile.Serial+'\'+IntToStr(UFile.PatchID));
  Param.Add('patchid='+IntToStr(UFile.PatchID));
  Param.Add('patchnotes='+UFile.PatchNotes);
  Param.Add('earliestversion='+UFile.EarliestVersion);
  Param.Add('latestversion='+UFile.LatestVersion);
  Param.Add('date='+DateToStr(UFile.Date));
  Param.Add('execaftersend='+BoolToStr(UFile.ExecAfterSend));

  DataParams.AddFile('file', UFile.FilePath, 'application/octet-stream');

  try
    http.Post('http://example.com/postFile.php', DataParams, Stream);
    ShowMessage(Stream.DataString);
    http.Post('http://example.com/uploadFiles.php', Param, DebugStream);
    ShowMessage(DebugStream.DataString);
    for J := 0 to Pred(Param.Count) do
      DebugStrings := DebugStrings + '&' + Param.Strings[J];
    ShowMessage(DebugStrings);
  except
    on E: EIdHTTPProtocolException do
    begin
      ShowMessage('Error code:' + IntToStr(E.ErrorCode));
    end
  end;

1 个答案:

答案 0 :(得分:0)

虽然这并没有真正解决两个帖子的问题,但它确实允许你上传一个包含其他数据的文件,这就是我开始做两个帖子的原因。

使用TIdMultiPartFormDataStream并添加文件AddFile,并使用AddFormField添加任何其他数据。

示例:

  DataParams.AddFile('file', UFile.FilePath, 'application/octet-stream');
  DataParams.AddFormField('serial', UFile.Serial);
  DataParams.AddFormField('filename', UFile.Name);