我写一个通过HTTP 80端口来传输文件的程序,要上传的目标WEB服务器是PHP做的,并且上传是有用户名和口令的。
现在可以通过TIdhttp取得WEB服务器的cookie,但我要上传文件时不知如何把cookie添加到TidHTTP.post中,请各位大虾帮帮忙如何实现啊?!  
取得cookie的部分代码如下:
......
try
    postList.Add('name=hj');
    postList.Add('passd=38888888');
    IdHttp1.AllowCookies:=true;
    IdHTTP1.Post( httpid,postList,Response);
finally
    Edit1.Text := IdHTTP1.Response.Server + ': ' + IdHTTP1.Response.ResponseText;
    Memo1.Lines.Add(Response.DataString);
......

解决方案 »

  1.   

    procedure TFrmUrlCommit.CommitUrlData(vRefererUrl: OleVariant;
      UserField, UserValue, PasswordField, PasswordValue: string;
      OtherPostData: OleVariant);
    // 内部小函数,把提交字符串写入variant;
      function GetPostData(Content: string): OleVariant;
      var
        I: Integer;
      begin
        Result := VarArrayCreate([0, length(content)], varByte);
        for i := 0 to Length(content) - 1 do
        begin
          Result[i] := Ord(content[i + 1]);
        end;
        Result[Length(content)] := 0;
      end;
      // 内部小函数结束
    var
      vHeaders, vPostData, vFrame, vFlags, vCommitData: OleVariant;
      aWBCommit: TWebBrowser;
    begin
      aWBCommit := TWebBrowser.Create(nil);
      vHeaders := 'Content-Type: application/x-www-form-urlencoded' + #10#13#0;  if VarIsNull(OtherPostData) then
        vCommitData := UserField + '=' + UserValue + '&' +
          PasswordField + '=' + PasswordValue
      else
        vCommitData := UserField + '=' + UserValue + '&' +
          PasswordField + '=' + PasswordValue + '&' + OtherPostData;
      vPostData := GetPostData(vCommitData);
      vFlags := 31;
      TVarData(vPostData).vType := varArray;
      aWBCommit.Navigate2(vRefererUrl, vFlags, vFrame, vPostData, vHeaders);
      FreeAndNil(aWBCommit);
    end;
      

  2.   

    还有你在登陆的时候要解析Cokies。然后使用返回值来进行操作。
      

  3.   

    ksaiy:
      我想再问一下,我把所取得的cookie内容是不是放在OtherPostData中呢?
      //我用IdHTTP1.cookiemanager:=Idcookiemanager1,然后调用Idcookiemanager1.cookiecollect.item[i]...取得的cookie,应该不需要解析吧?!
      

  4.   

    to ksaiy:
      我调用方式是:
        cookie1,httpid:OleVariant;
        cookie:=IdCookieManager1.CookieCollection.Items[0].CookieText;
        httpid:='http://52.96.191.188/webftp/index.php';
        CommitUrlData(httpid,user,gz,passd,inttostr(388888),cookie1);
    为总提示“invalid variant type”
      

  5.   

    procedure TGMail.Login;
    var
      Post : TStringList;
    begin
      if not mLoggedIn then
      begin
        Post := TStringList.Create;
        Post.Add('continue=http://gmail.google.com/gmail');
        Post.Add('service=mail');
        Post.Add('Email='+mUserName+'@gmail.com');
        Post.Add('Passwd='+mPassword);
        Post.Add('null=Sign in');
        mHTTP.Request.Referer :=  'https://www.google.com/accounts/ServiceLoginBox?service=mail&continue=http%3A%2F%2Fgmail.google.com%2Fgmail';    mData := mHTTP.Post('https://www.google.com/accounts/ServiceLoginBoxAuth',Post);
        GetSGH;    HTTPGet('http://gmail.google.com/gmail?_sgh='+mSGH);
        GetJSandGMAILAT;    mLoggedIn := true;
      end;
    end;