31 Ocak 2016 Pazar

Indy Clients TIdFTP bileşeni ile FTP sitelerinden upload/download

FTP sitelerinden nasıl dosya transferi yapacağız? Delphi olarak kaynak kodlarına yer vereceğim. Multi device application olmasını istediğimden FireMonkey destekler olacak.
Yeni bir proje oluşturun. Welcome Page'den
  • Create a new Multi-Device Application (Delphi)




Form üzerine 2 adet TButton, TMemo ve TIdFTP (Indy Clients sekmesinde) yerleştirin. Uygulamada implementation altındaki uses için System.IOUtils ve IdFTPCommon eklemeyi unutmayın.

FTP ile ilgili olarak kullanıcı adı, host ve şifrenizi kodda kendinize göre düzenleyin.

Kısaca bazı noktalara açıklık getirmem gerekiyor. FTP host transfer tipi binary mi yoksa ASCII mi bilmenizde fayda var. Buna dikkat etmeden yaptığım denemelerde Win32 ve W64 uygulamalarında sorun yaşamaz iken Android platformunda upload sırasında READ TIME OUT hatası aldım. Nette bir hayli konu ile ilgili sorun yaşayan var host kaynaklı olabileceği söylenmiş. Bileşenin ConnectionTimeOut, ReadTimeOut ve ListenTimeOut değerleri ile oynayın denilmiş ama ben bunlarla çözüm bulamadım. Transfer tipini binary yaptığımda sorun ortadan kalktı.

Dikkat edilecek bir noktada ilgili dosyanın yolu yani Android yada Windows üzerine işlem görecek dosyanın nereye kaydedileceği yada nereden upload edileceği. Her iki platformda da ortak kod yazmak amacı ile aşağıdaki gibi path kullanıldı.

System.IOUtils.TPath.GetSharedDownloadsPath + System.SysUtils.PathDelim + 'test.txt'


FTP üzerindeki dosyanın zaman bilgisini, Get-Put-ChangeDir gibi fonksiyonlarını örnekten inceleyin.

Nerede kullanacağım FTP ile ilgili kodu diyebilirsiniz. Demek ki henüz ihtiyaç oluşmamış :)







unit Unit6;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP,
  FMX.ScrollBox, FMX.Memo;

type
  TForm6 = class(TForm)
    IdFTP1: TIdFTP;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    dosya: String;
    procedure FtpParametre();
    procedure Mesaj(msg:String);
  public
    { Public declarations }
  end;

var
  Form6: TForm6;

implementation

{$R *.fmx}

uses System.IOUtils, IdFTPCommon;
// Upload işlemi

procedure TForm6.Button1Click(Sender: TObject);
begin
  try
    FtpParametre;
    IdFTP1.Connect;
    IdFTP1.ChangeDir('\www');
    if (FileExists(dosya)) then
        begin
            IdFTP1.Put(dosya,'test.txt',false);
            Memo1.Lines.Add('FTP upload işlemi tamamlandı');
        end else
        begin
            Memo1.Lines.Add('Upload edilecek dosya bulunamadı');
        end;
  except on E: Exception do
    begin
    Memo1.Lines.Add('FTP Hatası: '+E.ToString);
    Mesaj('FTP upload başarısız');
    end;
  end;
    IdFTP1.Disconnect;
    Memo1.Lines.Add('FTP bağlantı işlemi kesildi');
end;
// Download işlemi

procedure TForm6.Button2Click(Sender: TObject);
begin
  try
    FtpParametre;
    IdFTP1.Connect;
    Mesaj('FTP üzerindeki dosyanın değiş. tarih ve zaman');
    Mesaj(DateTimeToStr (IdFTP1.FileDate('\www\test.txt')));
    IdFTP1.ChangeDir('\www');
    IdFTP1.Get('test.txt',dosya, true);
    Mesaj('Dosya: '+ dosya);
    Mesaj('FTP download işlemi tamamlandı');
  except on E: Exception do
    begin
    Mesaj('!!! FTP Hatası: '+E.ToString);
    Mesaj('FTP download başarısız');
    end;
  end;
    IdFTP1.Disconnect;
    Mesaj('FTP bağlantı işlemi kesildi');

end;

procedure TForm6.FormCreate(Sender: TObject);
begin
dosya:= System.IOUtils.TPath.GetSharedDownloadsPath + System.SysUtils.PathDelim + 'test.txt';
Mesaj('Merhaba');
Mesaj('FTP Download Path: '+ System.IOUtils.TPath.GetSharedDownloadsPath);
end;

// Bağlantı için ön ayarlar
procedure TForm6.FtpParametre;
begin
  Mesaj('Bağlanıyor...');
  with IdFTP1 do begin
      Disconnect;
      Username :='ftpUserName';
      Host := 'ftpHost';
      Password := 'MyPassword';
      ConnectTimeout := 0;
      ListenTimeout := 10000;
      Passive := true;
      ReadTimeout := 30000;
      //TryNATFastTrack := true;
      TransferType := ftBinary;  // uses IdFTPCommon
  end;
end;

procedure TForm6.Mesaj(msg: String);
begin
Memo1.Lines.Add(msg);
end;

end.





Hiç yorum yok:

Yorum Gönder