Készítsünk hát egy függvényt, mely négy paramétert vár bemeneti értékként. Ezek sorban a következők: a távoli kiszolgáló neve, a távoli fájl elérési útvonala, annak a helyi fájlnak az elérési útvonala, melybe az adatmentést szeretnénk végezni, valamint a kapcsolat felépítéséhez szükséges ClientSocket komponens neve. Lássuk a függvény felépítését:
procedure DownloadFile(strHost, strRemoteFileName, strLocalFileName: string;
ClientSocket: TClientSocket);
var
intReturnCode: Integer;
s: string;
szBuffer: array[0..128] of Char;
FileOut: TFileStream;
Begin
Megvizsgáljuk, hogy a távoli fájl elérési útvonala „/” jellel kezdődik-e. Amennyiben nem, beszúrjuk azt a fájlnév elé.
if strRemoteFileName[1] <> '/' then
strRemoteFileName:= '/' + strRemoteFileName;
Létrehozunk egy FileOut nevű TFileStream típusú változót, melynek segítségével létrehozzuk a helyi kimeneti fájlunkat.
FileOut:=TFileStream.Create(strLocalFileName, fmCreate);
try
A ClientSocket számára átadjuk a strHost paraméterben kapott távoli kiszolgáló nevét, majd a GET paranccsal egy kérést küldünk felé a megadott fájl elérésére.
with ClientSocket do
begin
Host:=strHost;
ClientType:=ctBlocking;
Port:=80;
try
Open;
Az s szöveges változóban összeállítjuk a kérésünket.
s := 'GET ' + strRemoteFileName + ' HTTP/1.0'#13#10 +
'Host: ' + strHost + #13#10#13#10;
Az intReturnCode változóban eltároljuk a Socket küldendő adatokat tartalmazó bufferének méretét.
intReturnCode:=Socket.SendBuf(Pointer(s)^, Length(s));
if intReturnCode > 0 then
begin
Mindaddig fogadjuk a választ mindaddig, míg adat érkezik.
while (intReturnCode > 0) do
begin
Időnként kiürítjük az szBuffer karakter típusú tömböt, ugyanis az 128 karaktert képes csak tárolni.
FillChar(szBuffer, SizeOf(szBuffer), 0);
Az intReturnCode változónak átadjuk a Socket beérkező adatokat tartalmazó bufferének méretét. Ez lesz egyben a létrehozandó helyi fájlunk mérete is.
intReturnCode:=Socket.ReceiveBuf(szBuffer, SizeOf(szBuffer));
A beérkezett adatokat kiírjuk a helyi fájlba.
if intReturnCode > 0 then
FileOut.Write(szBuffer, intReturnCode);
end
end
else
MessageDlg('A szervertől nem érkezett válasz!', mtError, [mbOk], 0);
Az adatok fogadása után lezárjuk a kapcsolatot.
Close;
except
MessageDlg('Nincs kapcsolat!', mtError, [mbOk], 0);
end;
end;
finally
Végül felszabadítjuk a FileOut stream-et.
A mellékelt példaprogramban a Download gomb megnyomására meghívjuk a fenti függvényt. A bemeneti paramétereket egy-egy Edit ablakban tároljuk.
procedure TForm1.Button1Click(Sender: TObject);
begin
try
DownloadFile(Edit1.Text, Edit2.text, Edit3.Text, ClientSocket1);
ShowMessage('A letöltés befejeződött!');
except on ESocketError do
ShowMessage('A letöltés sikertelen volt!');
end;
end;