Indy gestiore server FTP lato Client
queste note si riferiscono ai componenti Indy
utilizzare il package Indy
dal pannello IndyClients Core utilizzare il componente TCP - sul form IdTCPClient1
dal pannello IndyClients Protocols (am) utilizzare il componente TIdFTP - sul form IdFTP1
in un Form inserite
- controllo TTreeView e assegnate nell'ObjectInspector Name = TVFolder
- controllo TListBox e assegnate nell'ObjectInspector Name = LbDirectory
- sRootDirFTP: string;
//connessione al server
procedure TForm1.ConnettiServerFTP;
var sMesg: string;
bEsito: Boolean;
begin
sMesg := 'Il Server FTP non risponde';
//Test Client su Server
bEsito := False;
//questo per ALice.it ,
//se usate invece un server su Host inserire l'indirizzo del server es: 62.211.68.45
idTCPClient1.Host := 'ftp.webalice.it';
idTCPClient1.Port := 21; //porta per comuicare con il server FTP
//un test per verificare se il servizio Host risponde
try
idTCPClient1.Connect;
try
IdTCPClient1.IOHandler.WriteLn('Client message');
Self.Caption := IdTCPClient1.IOHandler.ReadLn;
finally
IdTCPClient1.Disconnect;
bEsito := True;
end;
except
ShowMessage(sMesg);
end;
//se il server ha risposto possiamo procedere
if bEsito then
begin
//questo per ALice.it ,
//oppure inserire l'indirizzo es: 62.211.68.45
IdFTP1.Host := 'ftp.webalice.it';
IdFTP1.Port := 21;
try
//utilizzate il vostro account per accedere al server FTP
IdFTP1.Username := 'xxxxxxxxxx';
IdFTP1.Password := 'xxxxxxxxxx';
//per utilizzare la modalita ftBinary dovete aggiungere
//nelle uses la unit IdFTPCommon
IdFTP1.TransferType := ftBinary;
if IdFTP1.Connected then IdFTP1.Disconnect;
IdFTP1.Connect;
//questa e' una TStringList , dichiarabile cosi' FLastDirStack : TStringList;
FLastDirStack := TStringList.Create;
FLastDirStack.Clear;
sRootDirFTP := IdFTP1.RetrieveCurrentDir; //memorizziamo la directory radice
IdFTP1.List;
IdFTP1.List(LbDirectory.Items, '', false);
DisplayFTP;
except
ShowMessage(sMesg);
end;
end;
end;
questa sezione si occupa di visualizzare le directory presenti nel server
//legge e visualizza Directory presenti nel server FTP
procedure TForm1.DisplayFTP;
var i, c : Integer;
s : String;
begin
lbDirectory.Items.Clear;
IdFTP1.List(lbDirectory.Items, '', false);
TvFolder.Items.Clear;
for c := 0 to lbDirectory.Items.Count -1 do
begin
s := lbDirectory.Items[c];
i := IdFTP1.Size(s);
if i = -1 then TvFolder.Items.Add(nil, s); // Directory
end;
end;
il componente IdFTP ha degli eventi che possono essere utilizzati per avere
un controllo sullo stato di avanzamento del file.
IdFTP1.OnWorK
FTPWork(ASender, AWorkMode, AWorkCount);
IdFTP1.WorkBegin - chiamata all'inizio del trasferimento
//iDimFile dovra' essere Int64 e non Int -> iDimFile: Int64;
if AWorkMode = wmRead then AWorkCountMax := iDimFile;
FTPWorkBegin(ASender, AWorkMode, AWorkCountMax);
IdFTP1.WorkEnd
FTPWorkEnd(ASender, AWorkMode);
per scaricare un file dal server usate la funzione Get
IdFTP1.Get(s, SaveFile.FileName, True, IdFTP1.ResumeSupported);
procedure Tfrm_AccessoRemoto.act_DownloadExecute(Sender: TObject);
var i : Integer;
ext, s : String;
b : boolean;
begin
i := lbDirectory.ItemIndex;
if i <> -1 then
begin
s := lbDirectory.Items[i];
i := IdFTP1.Size(s);
iDimFile := i;
if i = -1 then CambioFTPDir(s) // Directory
else
begin
// File
ext := ExtractFileExt(s);
SaveFile.Filter := ext + ' files|*' + ext + '|All Files|*.*';
SaveFile.FileName := s;
if SaveFile.Execute then
begin
b := true;
if FileExists(SaveFile.FileName) then
if MessageDlg('File già presente : sovrascrivere ?', mtWarning, [mbYes,mbNo], 0) = mrYes then
DeleteFile(SaveFile.FileName);
{if ASCIIText1.Checked then
FTP.TransferType := ftASCII
else}
IdFTP1.TransferType := ftBinary;
if b then
IdFTP1.Get(s, SaveFile.FileName, True, IdFTP1.ResumeSupported);
end;
end;
end
else
MessageDlg('Il file da scaricare non è stato selzionato', mtWarning, [mbOK], 0);
end;
per Inviare al Server usate la funzione Put
IdFTP1.Put(OpenFile.FileName, ExtractFileName(OpenFile.FileName));
[/code]
procedure Tfrm_AccessoRemoto.act_UploadExecute(Sender: TObject);
begin
//utilizzata la unit Dialogs per scgliere il file
if OpenFile.Execute then
begin
IdFTP1.TransferType := ftBinary;
IdFTP1.Put(OpenFile.FileName, ExtractFileName(OpenFile.FileName));
DisplayFTP;
end;
end;
[/code]
per cambiare Directory , attivate nel TVFolder (TTreeView), l'evento OnDblClick,
in modo da poter cambiare.
//evento doppio click sul TTreeView (TVFolder)
procedure Tfrm_AccessoRemoto.TvFolderDblClick(Sender: TObject);
var i : Integer;
s : String;
begin
inherited;
if Assigned(TvFolder.Selected) then
lbDirectory.ItemIndex := lbDirectory.Items.IndexOf(TvFolder.Selected.Text);
else
lbDirectory.ItemIndex := -1;
i := lbDirectory.ItemIndex;
if i <> -1 then
begin
s := lbDirectory.Items[i];
i := IdFTP1.Size(s);
if i = -1 then CambioFTPDir(s); // Directory
end;
end;
//cambia Direcory e visualizza contenuti
procedure Tfrm_AccessoRemoto.CambioFTPDir(NewDir: String);
begin
FLastDirStack.Add(IdFTP1.RetrieveCurrentDir);
IdFTP1.ChangeDir(NewDir); //cambio directory
DisplayFTP; //visualizza
end;
da un qualunque livello per tornare alla radice utilizzare
la variabile sRootDirFTP memorizzata al momento della connessione
conviene utilizzare la variabile anziche' ChangeDir('\') , non sapendo a priori
quale Directory il server utilizzera' come Root
procedure Tfrm_AccessoRemoto.RootDir;
begin
IdFTP1.ChangeDir(sRootDirFTP);
DisplayFTP;
end;