2012-05-26 21 views
12

Tengo un script PHP simple en mi servidor web que necesito para cargar un archivo usando HTTP POST, que estoy haciendo en Delphi.Http Publicar con indy

Aquí está mi código con Indy pero parante no funcionará y no puedo entender lo que no estoy haciendo bien. ¿Cómo puedo ver lo que envío en el servidor? ¿Existe tal herramienta?

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

"No funciona" es la frase menos útil posible al depurar algo. ¿Qué no funciona? ¿Qué hace mal? –

+0

@MasonWheeler si supiera la respuesta probablemente no estaba haciendo esta pregunta. No sube al servidor web, ese es el problema, supongo que el encabezado del post está mal formado, pero no sé qué estoy haciendo mal. – opc0de

+0

por qué es MS.Clear; llamado antes de http.Post (URL, MS)? – ComputerSaysNo

Respuesta

18

Indy tiene TIdMultipartFormDataStream para este propósito:

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

Funciona pero deseo saber qué estaba haciendo mal en mi código ... – opc0de

+1

Use wireshark y compare el encabezado producido por su código e Indy ?? – whosrdaddy

+0

Es obvio, por supuesto, 'TIdMultipartFormDataStream' es la carga de un componente de archivo que he estado buscando ¿Cómo lo extrañé? :) –

2

Llamar a un PHP desde Indy puede fallar debido a la User-Agent, a continuación, se obtiene 403 de error.

Prueba esta manera, se fija para mí:

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

Se perdieron 2 caracteres '-'. Es mejor hacerlo:

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