我在我的网络服务器上有一个简单的
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;
解决方法
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;