2012-05-26 14 views
12

Ich habe ein einfaches PHP-Skript auf meinem Webserver, die ich eine Datei mithilfe von HTTP POST hochladen muss, was ich in Delphi mache.Http Post mit Indy

Hier ist mein Code mit Indy aber aparantely wird es nicht funktionieren und ich kann nicht herausfinden, was ich nicht richtig mache. Wie kann ich sehen, was ich auf dem Server sende, gibt es ein solches 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; 
+2

"Es funktioniert nicht" ist die am wenigsten nützliche Phrase beim Debuggen von etwas. Was funktioniert nicht? Was macht es falsch? –

+0

@MasonWheeler Wenn ich die Antwort wüsste, würde ich diese Frage wahrscheinlich nicht stellen. Es wird nicht auf den Webserver hochgeladen, das ist das Problem, meine Vermutung, dass der Post-Header falsch ist, aber ich weiß nicht, was ich falsch mache. – opc0de

+0

Warum ist MS.Clear; vor http.Post (URL, MS) aufgerufen? – ComputerSaysNo

Antwort

18

Indy hat TIdMultipartFormDataStream zu diesem Zweck:

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; 
+0

Es funktioniert, aber ich möchte wissen, was ich falsch in meinem Code getan habe ... – opc0de

+1

Verwenden Sie wireshark und vergleichen Sie die Header von Ihrem Code und Indy produziert ?? – whosrdaddy

+0

Es ist natürlich so offensichtlich, 'TIdMultiPartFormDataStream' ist das Hochladen einer Dateikomponente, die ich gesucht habe, wie habe ich es vermisst? :) –

2

ein PHP von Indy aufrufen kann, weil der User-Agent fehlschlagen, können Sie dann 403 Fehler.

versuchen auf diese Weise, ist es für mich festgelegt:

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; 
0

Sie verloren 2 Zeichen '-'. Es ist besser, dies zu tun:

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