Seorang teman bertanya mengenai upload file dengan Delphi component Indy. Setelah googling dan nanya-nanya sama Mas Totok, akhirnya ketemu juga caranya yang cukup mudah.
Untuk di server, cukup membutuhkan komponen TIDHttpServer dan di client TIDHttp.
unit unitClient;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP;
type
TformMain = class(TForm)
IdHTTP1: TIdHTTP;
btnSend: TButton;
OpenDialog1: TOpenDialog;
procedure btnSendClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
formMain: TformMain;
implementation
uses
IdMultipartFormData;
{$R *.dfm}
{ TForm8 }
procedure TformMain.btnSendClick(Sender: TObject);
var
Stream: TStringStream;
Params: TIdMultipartFormDataStream;
begin
try
Stream := TStringStream.Create('');
try
Params := TIdMultipartFormDataStream.Create;
try
if OpenDialog1.Execute then
begin
Params.AddFile('File1', OpenDialog1.FileName,
'application/octet-stream');
try
IdHTTP1.Post('http://localhost:8080/upload', Params, Stream);
except
on E: Exception do
ShowMessage('Error encountered during Post: ' + E.Message);
end;
end;
finally
Params.Free;
end;
finally
Stream.Free;
end;
except
end;
end;
end.
Sedangkan untuk di sisi servernya:
unit TestHTTPServer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdCustomHTTPServer,
IdHTTPServer, IdContext, StdCtrls;
type
TformMain = class(TForm)
IdHTTPServer1: TIdHTTPServer;
Memo1: TMemo;
procedure IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
formMain: TformMain;
implementation
{$R *.dfm}
procedure TformMain.FormCreate(Sender: TObject);
begin
IdHTTPServer1.Active := True;
end;
procedure TformMain.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
memStream: TMemoryStream;
begin
memStream := TMemoryStream.Create;
memStream.CopyFrom(ARequestInfo.PostStream, 0);
try
Memo1.Lines.Add('Saving to c:\test.zip...');
memStream.SaveToFile('c:\test.zip');
Memo1.Lines.Add('Saving done!');
finally
memStream.Free;
end;
end;
end.


