Http Post with indy

delphi, http, indy, post

Solution

Indy has `TIdMultipartFormDataStream` for this purpose:

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;

Problem

I have a simple php script on my web server which I need to upload a file using HTTP POST, which I am doing in Delphi. Here is my code with Indy but aparantely it won't work and I can't figure out what i am not doing properly. How can I view what I send on the server is there such a tool ? ``` 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; ```

Original source