idFTP ile yükleme sorunsalı!...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen ertank »

theSinan02 yazdı: 31 Eki 2017 01:16 ertank hocam tskler
aynen dediğiniz gibi çıktı
sorun yedeği atmak için oluşturduğum dizin yapısından kaynaklanıyormuş (bazı sunucularda yapıp bazı sunucularda yapmaması çok garip değil mi)
Ben sorunun Türkçe diline özel karakter içeren dizin veya dosya adı sebebiyle olabileceğini söylemek istemiştim. Anlaşılır ifade edememişim. Bazı müşterileriniz Türkçe karakter içermeyen kullanıcı adı ile çalışır iken diğerleri Türkçe karakter içeren kullanıcı isimleri kullanıyor olacağı için bazı müşterilerinizde sorun yaşamaz iken diğerlerinde yaşıyorsunuz.
theSinan02 yazdı: 31 Eki 2017 01:16 dizin kontrolunu başka nasıl yapabilirim
Dizin kontrolü değil sorununuz.

İlk cevabımda sizden bazı sorularıma cevap istemiştim. Cevabımı tekrar okuyup sorulara yanıt verebilir misiniz? Öncelikle sorunun nerede olduğunu anlamak gerekli ki çözümü için ne yapılabileceği o zaman belli olur.
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen theSinan02 »

s.a vize sınavlarımından dolayı bakamadım

c++ Builder Versiyonum = 10.1 Berlin
Indy(IdTCP) Versiyon = 10.6.2.5341
TIdLogEvent tarafından (IdFTP->Intercept) oluşturulan bir dosya Malesef Yok
Zaten Nasıl Dosya kaydedeceğimide Bilmiyorum :)

Sorunun Türkçe Karakter Olamayacagını Düşünüyorum
D,Onemli_Yazilim,Projeler,TEKNIK,SERVER,Win32,Release
Bu Dizinleri Sırasıyla Oluşturmaya çalışıyor
Bu dizinlerde Türkçe Karakter Göremedim
Tabiki bu acemi insan bakışı

Bu Satır Çalışınca
IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_DIZINLER->Strings,true);


the system cannot find the file specifed.

Hatayı veriyor

yardımlarınız için tskler
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen ertank »

Örnek kullanım şekli ile FTP sunucuya erişilemiyor. Test için erişim sağlayabilecek kullanıcı ve şifre bilgisi paylaşabilir misiniz?
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen theSinan02 »

S.a hocam bu sekilde çalışır

ftp adres : 5.2.84.41
kullanıcı adı :karkas
parola : Karkas987654

Kod: Tümünü seç


UnicodeString __fastcall TForm1::FTP_AKTARIM(UnicodeString HOST, UnicodeString KULLANICI_ADI, UnicodeString PAROLA, bool PasifMod, UnicodeString DOSYA_ADI)
{
	try{
		   TIdFTP  *IdFTP1 =  new  TIdFTP(this);
			if (IdFTP1->Connected())
				  IdFTP1->Disconnect();
			IdFTP1->Intercept = IdLogEvent1;
			IdLogEvent1->Active = true;
			IdFTP1->Passive =  PasifMod;
			IdFTP1->TransferType = ftBinary ;

		   //FTP Adresini Bölüyoruz
		   HOST = KARAKTER_DEGISTIR(HOST,"ftp://","");
		   HOST = KARAKTER_DEGISTIR(HOST,"/",",");
		   TStringList *FTP_ADRESI = new TStringList();
						FTP_ADRESI->DelimitedText =HOST;
						FTP_ADRESI->Delimiter=',';

			IdFTP1->Host = FTP_ADRESI->Strings[0];
			IdFTP1->Username = KULLANICI_ADI;
			IdFTP1->Password = PAROLA;
			IdFTP1->Connect();

			TStringList *FTP_KLASOR_ICERIGI = new TStringList();
			if(FTP_ADRESI->Count > 1)
				{
				 for(int i=1;i<FTP_ADRESI->Count;i++)
							{
							 if(FTP_ADRESI->Strings[i] !="" )
									{
									IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_ADRESI->Strings[i],true);
									//DİZİN İÇERİĞİ VARMI (KLASÖR KONTROLU YAPIYORUM)
									if (FTP_KLASOR_ICERIGI->Count < 1 )
										//DİZİN DAHA ÖNCE OLUŞTURULMAMIŞSA YENİ DİZİN OLUŞTURACAĞIZ
										IdFTP1->MakeDir(FTP_ADRESI->Strings[i]) ;
                      					                        //DIZINI DEĞİŞTİRİYORUZ
										IdFTP1->ChangeDir(FTP_ADRESI->Strings[i]);
									 }
							}		
			  	}
		   //FTP YE GÖNDERİLECEK DOSYA_ADI
		   //ShowMessage( DOSYA_ADI);
			/*
			
			
			BU KISMI İPTAL EDERSEM 
			DIZIN OLUSTURMAYACAGINDAN CALISIYOR
			
			
			UnicodeString FTP_DIZIN_YOLU = DOSYA_ADI.SubString0(DOSYA_ADI.Pos(Form1->BILGISAYAR_ADI_AL())-1, DOSYA_ADI.Length() - (DOSYA_ADI.Pos( Form1->BILGISAYAR_ADI_AL())-1) );
			FTP_DIZIN_YOLU  = ExtractFileDir( FTP_DIZIN_YOLU ) ;
			FTP_DIZIN_YOLU = KARAKTER_DEGISTIR(FTP_DIZIN_YOLU,"\\",",");
			TStringList *FTP_DIZINLER = new TStringList();
			FTP_DIZINLER->DelimitedText   =FTP_DIZIN_YOLU;
			FTP_DIZINLER->Delimiter=',';
						for(int i=0;i<FTP_DIZINLER->Count;i++)
							{
							 //DİZİNADI BOŞ DEĞİLSE
							 if(FTP_DIZINLER->Strings[i] !="" )
									{
									IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_DIZINLER->Strings[i],true);
									//DİZİN İÇERİĞİ VARMI (KLASÖR KONTROLU YAPIYORUZ)
									if (FTP_KLASOR_ICERIGI->Count < 1 )
										//DİZİN DAHA ÖNCE OLUŞTURULMAMIŞSA YENİ DİZİN OLUŞTURACAĞIZ
										IdFTP1->MakeDir(FTP_DIZINLER->Strings[i]) ;
										 //DIZINI DEĞİŞTİRİYORUZ
										IdFTP1->ChangeDir(FTP_DIZINLER->Strings[i]);
									 }
							}
							FTP_DIZINLER->Free();
							
							*/
							
							FTP_KLASOR_ICERIGI->Free();
							
			//FTPye Dosyayı Gönderiyoruz
			IdFTP1->Put(DOSYA_ADI,ExtractFileName ( DOSYA_ADI ),false);
			IdFTP1->List();
			IdFTP1->Disconnect();
            delete IdFTP1;
		}catch(Exception *HATA)
		{
		ShowMessage(HATA->Message);
		return "0";
		}
	  return "-1" ;
}


ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen ertank »

Merhaba,

Örnek kullanım şekli prosedür testi için uygun değil idi. Ben aşağıdaki gibi çağırdım prosedürü:

Kod: Tümünü seç

FTP_AKTARIM('ftp://5.2.84.41/deneme/test/sondizin/üğişı/burası', 'karkas', 'Karkas987654', False, 'C:\temp\abc\def\xğiş\yedek\Encoding Time.csv')
Ayrıca prosedürü Delphi'ye aşağıdaki şekilde dönüştürdüm:

Kod: Tümünü seç

procedure TForm1.FTP_AKTARIM(const HOST, KULLANICI_ADI, PAROLA: string; const PasifMod: Boolean; const DOSYA_ADI: string);
var
  IdFTP: TIdFTP;
  TempString: string;
  FtpAdresi: TStringList;
  FtpKlasorIcerigi: TStringList;
  FtpDizinler: TStringList;
  FtpDizinYolu: string;
  I: Integer;
begin
  IdFTP := TIdFTP.Create(nil);
	try
    try
			IdFTP.Passive := PasifMod;
			IdFTP.TransferType := ftBinary;

		  //FTP Adresini Bölüyoruz
		  TempString := StringReplace(HOST, 'ftp://', EmptyStr, []);
		  TempString := StringReplace(TempString, '/', ',', [rfReplaceAll]);
      if TempString[TempString.Length] = '/' then SetLength(TempString, TempString.Length - 1);
      FtpAdresi := TStringList.Create();
      try
        FtpAdresi.StrictDelimiter := True;
        FtpAdresi.Delimiter := ',';
        FtpAdresi.DelimitedText := TempString;

        IdFTP.Host := FtpAdresi[0];
        IdFTP.Username := KULLANICI_ADI;
        IdFTP.Password := PAROLA;
        try
          IdFTP.Connect();
        except
          on E: Exception do
          begin
            ShowMessage('Bağlantı hatası: ' + E.Message);
            Exit()
          end;
        end;

        FtpKlasorIcerigi := TStringList.Create();
        try
          if FtpAdresi.Count > 1 then
          begin
            for I := 1 to Pred(FtpAdresi.Count) do
            begin
              if FtpAdresi[I] <> EmptyStr then
              begin
                try
                  IdFTP.ChangeDir(FtpAdresi[I]);
                except
                  IdFTP.MakeDir(FtpAdresi[I]);
                  IdFTP.ChangeDir(FtpAdresi[I]);
                end;
              end;
            end;

            FtpDizinYolu := DOSYA_ADI.Substring(Pos(ComputerName(), DOSYA_ADI)-1, DOSYA_ADI.Length - Pos(ComputerName(), DOSYA_ADI)-1);
            FtpDizinYolu := ExtractFileName(FtpDizinYolu);
            FtpDizinYolu := StringReplace(FtpDizinYolu, '\\', ',', [rfReplaceAll]);
            if FtpDizinYolu[FtpDizinYolu.Length] = '\' then SetLength(FtpDizinYolu, FtpDizinYolu.Length - 1);

            FtpDizinler := TStringList.Create();
            try
              FtpDizinler.Delimiter := ',';
              FtpDizinler.DelimitedText := FtpDizinYolu;
              for I := 0 to Pred(FtpDizinler.Count) do
              begin
                if FtpDizinler[I] <> EmptyStr then
                begin
                  try
                    IdFTP.ChangeDir(FtpDizinler[I]);
                  except
                    IdFTP.MakeDir(FtpDizinler[I]);
                    IdFTP.ChangeDir(FtpDizinler[I]);
                  end;
                end;
              end;
            finally
              FtpDizinler.Free();
            end;
          end;
        finally
          FtpKlasorIcerigi.Free();
        end;
      finally
        FtpAdresi.Free();
      end;

      IdFTP.Put(DOSYA_ADI, ExtractFileName(DOSYA_ADI), False);
      IdFTP.Disconnect();
    except
      on E: Exception do
      begin
        ShowMessage(E.Message);
      end;
    end;
  finally
    IdFTP.Free();
  end;
end;
Yukarıdaki kod bir hata ile karşılaşmadan yüklemeyi yaptı.

Kod içindeki en önemli değişiklik TIdFTP.List() kullanmak yerine direk TIdFTP.ChangeDir() kullanmak oldu. List komutu hata mesajı vermediği durumlar olabiliyor. Konu hakkında detaylı bilgi için:
https://stackoverflow.com/questions/279 ... nd-makedir

Her ne kadar Türkçe karakter içeren dizin isimleri kullansam da FileZilla ile bakıldığı zaman bu isimler farklı karakterler olarak gözükmektedir. Diğer taraftan yükleme yapılan işletim sistemi üzerinde yine düzgün Türkçe karakterler olarak gözükeceğini düşünüyorum. Sadec FTP iletişimi sırasında doğru şekilde Türkçe karakter gösterilememekte.

Yukarıdaki kodu C++ şekline uyarlayıp deneyebilirsiniz. Çok ciddi bir değişiklik gerekmemekte.

Ancak yanlış anlamadı isem C++ örnek prosedürü FtpAdresi nesnesini Free etmiyor ve hafıza kaçağı oluşuyor. Bunun kontrolü gerekecektir.
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen theSinan02 »

ertank yazdı: 08 Kas 2017 03:48 Merhaba,

Örnek kullanım şekli prosedür testi için uygun değil idi. Ben aşağıdaki gibi çağırdım prosedürü:

Kod: Tümünü seç

FTP_AKTARIM('ftp://5.2.84.41/deneme/test/sondizin/üğişı/burası', 'karkas', 'Karkas987654', False, 'C:\temp\abc\def\xğiş\yedek\Encoding Time.csv')
Ayrıca prosedürü Delphi'ye aşağıdaki şekilde dönüştürdüm:

Kod: Tümünü seç

procedure TForm1.FTP_AKTARIM(const HOST, KULLANICI_ADI, PAROLA: string; const PasifMod: Boolean; const DOSYA_ADI: string);
var
  IdFTP: TIdFTP;
  TempString: string;
  FtpAdresi: TStringList;
  FtpKlasorIcerigi: TStringList;
  FtpDizinler: TStringList;
  FtpDizinYolu: string;
  I: Integer;
begin
  IdFTP := TIdFTP.Create(nil);
	try
    try
			IdFTP.Passive := PasifMod;
			IdFTP.TransferType := ftBinary;

		  //FTP Adresini Bölüyoruz
		  TempString := StringReplace(HOST, 'ftp://', EmptyStr, []);
		  TempString := StringReplace(TempString, '/', ',', [rfReplaceAll]);
      if TempString[TempString.Length] = '/' then SetLength(TempString, TempString.Length - 1);
      FtpAdresi := TStringList.Create();
      try
        FtpAdresi.StrictDelimiter := True;
        FtpAdresi.Delimiter := ',';
        FtpAdresi.DelimitedText := TempString;

        IdFTP.Host := FtpAdresi[0];
        IdFTP.Username := KULLANICI_ADI;
        IdFTP.Password := PAROLA;
        try
          IdFTP.Connect();
        except
          on E: Exception do
          begin
            ShowMessage('Bağlantı hatası: ' + E.Message);
            Exit()
          end;
        end;

        FtpKlasorIcerigi := TStringList.Create();
        try
          if FtpAdresi.Count > 1 then
          begin
            for I := 1 to Pred(FtpAdresi.Count) do
            begin
              if FtpAdresi[I] <> EmptyStr then
              begin
                try
                  IdFTP.ChangeDir(FtpAdresi[I]);
                except
                  IdFTP.MakeDir(FtpAdresi[I]);
                  IdFTP.ChangeDir(FtpAdresi[I]);
                end;
              end;
            end;

            FtpDizinYolu := DOSYA_ADI.Substring(Pos(ComputerName(), DOSYA_ADI)-1, DOSYA_ADI.Length - Pos(ComputerName(), DOSYA_ADI)-1);
            FtpDizinYolu := ExtractFileName(FtpDizinYolu);
            FtpDizinYolu := StringReplace(FtpDizinYolu, '\\', ',', [rfReplaceAll]);
            if FtpDizinYolu[FtpDizinYolu.Length] = '\' then SetLength(FtpDizinYolu, FtpDizinYolu.Length - 1);

            FtpDizinler := TStringList.Create();
            try
              FtpDizinler.Delimiter := ',';
              FtpDizinler.DelimitedText := FtpDizinYolu;
              for I := 0 to Pred(FtpDizinler.Count) do
              begin
                if FtpDizinler[I] <> EmptyStr then
                begin
                  try
                    IdFTP.ChangeDir(FtpDizinler[I]);
                  except
                    IdFTP.MakeDir(FtpDizinler[I]);
                    IdFTP.ChangeDir(FtpDizinler[I]);
                  end;
                end;
              end;
            finally
              FtpDizinler.Free();
            end;
          end;
        finally
          FtpKlasorIcerigi.Free();
        end;
      finally
        FtpAdresi.Free();
      end;

      IdFTP.Put(DOSYA_ADI, ExtractFileName(DOSYA_ADI), False);
      IdFTP.Disconnect();
    except
      on E: Exception do
      begin
        ShowMessage(E.Message);
      end;
    end;
  finally
    IdFTP.Free();
  end;
end;
Yukarıdaki kod bir hata ile karşılaşmadan yüklemeyi yaptı.

Kod içindeki en önemli değişiklik TIdFTP.List() kullanmak yerine direk TIdFTP.ChangeDir() kullanmak oldu. List komutu hata mesajı vermediği durumlar olabiliyor. Konu hakkında detaylı bilgi için:
https://stackoverflow.com/questions/279 ... nd-makedir

Her ne kadar Türkçe karakter içeren dizin isimleri kullansam da FileZilla ile bakıldığı zaman bu isimler farklı karakterler olarak gözükmektedir. Diğer taraftan yükleme yapılan işletim sistemi üzerinde yine düzgün Türkçe karakterler olarak gözükeceğini düşünüyorum. Sadec FTP iletişimi sırasında doğru şekilde Türkçe karakter gösterilememekte.

Yukarıdaki kodu C++ şekline uyarlayıp deneyebilirsiniz. Çok ciddi bir değişiklik gerekmemekte.

Ancak yanlış anlamadı isem C++ örnek prosedürü FtpAdresi nesnesini Free etmiyor ve hafıza kaçağı oluşuyor. Bunun kontrolü gerekecektir.
Hocam Allah razı olsun

IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_ADRESI->Strings,true);

Yerine
try
{
IdFTP1->ChangeDir(FTP_DIZINLER->Strings);
}
içine Alıp Çalıştırdım
Harika Oldu


Bunun Yerine

Kod: Tümünü seç

for(int i=1;i<FTP_ADRESI->Count;i++)
	{
		 if(FTP_ADRESI->Strings[i] !="" )
			{
			IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_ADRESI->Strings[i],true);
			//DİZİN İÇERİĞİ VARMI (KLASÖR KONTROLU YAPIYORUM)
				if (FTP_KLASOR_ICERIGI->Count < 1 )
					//DİZİN DAHA ÖNCE OLUŞTURULMAMIŞSA YENİ DİZİN OLUŞTURACAĞIZ
					IdFTP1->MakeDir(FTP_ADRESI->Strings[i]) ;
                      			//DIZINI DEĞİŞTİRİYORUZ
					IdFTP1->ChangeDir(FTP_ADRESI->Strings[i]);
			 }
	}


Şu Hale Geldi Hem Kod Azaldı hem İstediğim oldu

Kod: Tümünü seç


	for(int i=0;i<FTP_DIZINLER->Count;i++)
		{
		
		 if(FTP_DIZINLER->Strings[i] !="" )
			{
				 try
					{
					 IdFTP1->ChangeDir(FTP_DIZINLER->Strings[i]);
					 }

					catch(Exception *HATA)
					 {
					IdFTP1->MakeDir(FTP_DIZINLER->Strings[i]) ;
					IdFTP1->ChangeDir(FTP_DIZINLER->Strings[i]);
					}
					
			}

		}


Allah Razı Olsun Sorunum Çözüldü
İstanbul AVRUPA Yakasında iseniz Hem Tanışmak Hem Bişeyler İkram Etmek isterim
Alper_Dari
Üye
Mesajlar: 7
Kayıt: 06 Nis 2022 01:54

Re: idFTP ile yükleme sorunsalı!...

Mesaj gönderen Alper_Dari »

xozcanx yazdı: 29 Eki 2017 05:38 Merhaba,
Nedense aynı dönmelerde aynı geliştirmeler ve aynı sorunlar yaşanıyor :?:
Geçen hafta da benim aynı geliştirmeye ihtiyacım oldu ve aynı sıkıntıyı yaşamıştım.Biraz araştırma ile sorunu aşağıdaki şekilde çözdüm ve sorunsuz kullanıyorum.
Veli hocamız gerekli ipucunu vermiş aslında.
Çözüm için,

Kod: Tümünü seç

Uses
IdFTPCommon
....
    Try
      ftp.Host     := FTPUzakSunucu.Text;
      ftp.Username := FTPKullanici.Text;
      ftp.password := FTPParola.Text;
      FTP.Passive  :=True;
      ftp.Port     :=21;
      FTP.TransferType := ftBinary;// Bu alanı Eklemeniz gerekmektedir.
      ftp.Connect;
      ftp.ChangeDir(FtpUzakKlasor.Text);
      ftp.Put(EdtDosyaYolu.Text);
      ftp.Quit;
      ftp.Disconnect;
    except on E: Exception do
      Begin
      //  Mesaj(3,E,'Dosya Transferi Başarısız oldu!','');
        ftp.Quit;
        ftp.Disconnect;
      End;
    End;
Policy requires SSL hatası vermeye başladı.
SSL sertifikası yoktu, çalışıyordu. Sanırım IIS ye güncelleme geldi bu hatayı veriyor.Bunu nasıl çözebilirim.
Cevapla