【问题标题】:Http Post with indy带有 indy 的 Http Post
【发布时间】:2012-05-26 11:02:01
【问题描述】:

我的网络服务器上有一个简单的 php 脚本,我需要使用 HTTP POST 上传文件,这是我在 Delphi 中所做的。

这是我在 Indy 上的代码,但显然它不起作用,我无法弄清楚我做错了什么。我如何查看我发送的服务器上是否有这样的工具?

procedure TForm1.btn1Click(Sender: TObject);
var
  fname : string;
  MS,dump : TMemoryStream;
  http  : TIdHTTP;

const
  CRLF = #13#10;
begin
  if PromptForFileName(fname,'','','','',false) then
  begin
    MS := TMemoryStream.Create();
    MS.LoadFromFile(fname);
    dump := TMemoryStream.Create();
    http := TIdHTTP.Create();
    http.Request.ContentType:='multipart/form-data;boundary =-----------------------------7cf87224d2020a';
    fname := CRLF + '-----------------------------7cf87224d2020a' + CRLF + 'Content-Disposition: form-data; name=\"uploadedfile\";filename=\"test.png"' + CRLF;
    dump.Write(fname[1],Length(fname));
    dump.Write(MS.Memory^,MS.Size);
    fname := CRLF + '-----------------------------7cf87224d2020a--' + CRLF;
    dump.Write(fname[1],Length(fname));
    ShowMessage(IntToStr(dump.Size));
    MS.Clear;
    try
    http.Request.Method := 'POST';
    http.Post('http://posttestserver.com/post.php',dump,MS);
    ShowMessage(PAnsiChar(MS.Memory));
    ShowMessage(IntToStr(http.ResponseCode));
    except
    ShowMessage('Could not bind socket');
    end;
  end;
end;

【问题讨论】:

  • “It doesn't work”是调试某些东西时最没用的短语。什么不起作用?它做错了什么?
  • @MasonWheeler 如果我知道答案,可能我不是在问这个问题。它没有上传到网络服务器,这是我猜测帖子标题格式错误但我不知道我做错了什么的问题。
  • 为什么是 MS.Clear;在 http.Post( URL, MS ) 之前调用?
  • 所以你没有收到任何错误信息或任何东西,只是默默地失败了?这就是不起作用的意思。否则说“我收到此错误代码”或其他任何内容。

标签: delphi http post indy


【解决方案1】:

Indy 有 TIdMultipartFormDataStream 用于此目的:

procedure TForm1.SendPostData;
var
  Stream: TStringStream;
  Params: TIdMultipartFormDataStream;
begin
  Stream := TStringStream.Create('');
  try
   Params := TIdMultipartFormDataStream.Create;
   try
    Params.AddFile('File1', 'C:\test.txt','application/octet-stream');
    try
     HTTP.Post('http://posttestserver.com/post.php', Params, Stream);
    except
     on E: Exception do
       ShowMessage('Error encountered during POST: ' + E.Message);
    end;
    ShowMessage(Stream.DataString);
   finally
    Params.Free;
   end;
  finally
   Stream.Free;
  end;
end;

【讨论】:

  • 使用wireshark比较你的代码和Indy产生的header??
  • 它如此明显TIdMultipartFormDataStream 是我一直在寻找的上传文件组件,我怎么会错过它? :)
  • @TobyAllen:每天学习新事物是开发人员职业生涯的一部分 :)
  • 仅供参考,对于不熟悉 php 或 indy 的任何人:此示例中的 File1 是 php 中 $_FILES[""] 的变量名称。我花了一段时间才弄清楚!谢谢你的好答案。
【解决方案2】:

由于用户代理,从 Indy 调用 PHP 可能会失败,然后您会收到 403 错误。

试试这个方法,它为我修好了:

var Answer: string;
begin
  GetHTML:= TIdHTTP.create(Nil);
  try
    GetHTML.Request.UserAgent:= 'Mozilla/3.0';
    Answer:= GetHTML.Get('http://www.testserver.com/test.php?id=1');
  finally
    GetHTML.Free;
  end;
end;

【讨论】:

    【解决方案3】:

    您丢失了 2 个字符“--”。最好这样做:

    http.Request.ContentType:='multipart/form-data;boundary='+myBoundery;
    fname := CRLF + '--' + myBoundery + CRLF + 'Content-Disposition: form-data; name=\"uploadedfile\";filename=\"test.png"' + CRLF;
    

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 2013-03-14
      • 2017-12-08
      • 2011-08-27
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多