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;

Codice: [Seleziona]

//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

Codice: [Seleziona]

//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);

Codice: [Seleziona]

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.

Codice: [Seleziona]

//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

Codice: [Seleziona]

procedure Tfrm_AccessoRemoto.RootDir;
begin
  IdFTP1.ChangeDir(sRootDirFTP);
  DisplayFTP;
end;


SMF 2.0.8 | SMF © 2011, Simple Machines
Privacy Policy
SMFAds for Free Forums
TinyPortal © 2005-2012

Go back to article