idFTP ile yükleme sorunsalı!...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

idFTP ile yükleme sorunsalı!...

Mesaj gönderen sabanakman »

İyi günler. Başıma gelen çok ilginç bir durumu aktarmak istiyorum. Deneme amaçlı yaptığım bir uygulamam var. Bu uygulamada basit başka bir projeyi, belirli aralıklarla derleyip, sıkıştırıp internette iki farklı sunucuya yükleyen bir sistem geliştirmekteyim. İşin can alıcı noktası ise, bu derlenmiş dosyayı .zip olarak sıkıştırıp internete Indy Client bileşeni olan idFTP'nin Put metodu ile attığım zaman (parametrelerde hem dosya adı ile (FileName:String) hem de TMemoryStream ile (Stream:TStream) ayrı ayrı denememe rağmen ikisi de aynı şekilde çalışarak) bir sunucuya doğru olarak yüklerken, diğer sunucuya bir byte eksik yüklemektedir. İncelediğimde ise son bir kaç "byte"ın "0" olduğunu ve bu "byte"lardan sadece sonuncusunun eksik olduğunu fark ettim. Aynı idFTP.Put metodu diğer sunucuya doğru yükleme yapmaktadır. Bir diğer çarpıcı nokta ise bu dosyayı Delphi2005 ile derlemiş, onu sıkıştırıp göndermeye çalışmıştım. Bunu bir de Delphi7 ile derleyip, sıkıştırıp gönderdiğimde ise her iki sunucuya yüklenen dosya doğru olarak yüklenebilmektedir. Ben de buraya kadar dedim denemeleri bıraktım, delphi7 kullanacağımdır ama her şey kağıt üstünde normal iken böyle bir sorunun sebebi sizce nedendir bilen var mıdır acep? Zaten sonraki testlerime çalışan delphi7'ye göre devam edeceğimdir ama belirttiğim bu sıkıntımın sebebi ftp sunucudan mı kaynaklanmaktadır bilemedim. Bu soruyu da olaya kendimce net bir nokta koyamadım ondan sordum :shock: . İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

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

Mesaj gönderen SimaWB »

İlk aklıma gelen FTP Client'ın TransferType özelliği. Her iki durumda da ftBinary olduğundan emin olunuz.
Lokal'de kendi yazacağınız FTP sunucu ile (Indy demo'larında vardı sanıyorum) test edip, problemin FTP sunucudan kaynaklanıp kaynaklanmadığını anlayabilirsiniz.
There's no place like 127.0.0.1
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

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

Mesaj gönderen freeman35 »

Delphi 2005 de unicode varmıydı? ondan kaynaklı bir problem olabilir. indy versiyonlarıda sanırım aynıdır.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

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

Mesaj gönderen sabanakman »

SimaWB yazdı:İlk aklıma gelen FTP Client'ın TransferType özelliği. Her iki durumda da ftBinary olduğundan emin olunuz....
Sanırım kopyala yapıştır ile program yazmanın böyle yan etkileri oluyor. FTP'ye dosya yükleyen bir şablon hazırlamıştım bir zamanlar, çalıştığı için onu aynen kullandım. Bu özelliğin ftASCII olması hiç gözüme çarpmamış. Bunun da protokolü etkileyen çok önemli bir unsur olduğuna şahit olmuş bulunmaktayım. Kodu geliştirirken hep çalışıyor olması nedeniyle o kadar önemsememiştim hal bu ki :oops: . Aynı bileşen, aynı ayarla aynı dosyayı bir sunucuya doğru diğerine yanlış yükleme yapması sunucuda problem var gibi bir izlenim uyandırdı, o beni yanılttı :D . Bir ara TMS.TWebCopy bileşenini de kurcalamakta fayda var :mrgreen: .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

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

Mesaj gönderen theSinan02 »

S.a aynı sıkıntı bende de var
Foruma yazacaktım once araştır sonra yaz
Buldum inşallah pazartesi deneyeceğim
birde
Aynı bağlantı bilgileri ile FileZilla ile bağlantı yaptığım halde
idftp bazı ftp lere bağlanmıyor
nedeni ne olabilir TransferType mıdır
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

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

Mesaj gönderen ertank »

Merhaba,

Bağlanmadığı zaman hata mesajı alıyor musunuz? Evet ise hata nedir?

Detay bilgi vermeden çok yardımcı olmak mümkün olmuyor.
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

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

Mesaj gönderen theSinan02 »

Hat mesajı veriyor ancak pc iş yerinde oldugunda su anda hata mesajı aklıma gelmiyor inşallah pazartesi deneyip buraya yazacağım
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

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

Mesaj gönderen xozcanx »

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;
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

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

Mesaj gönderen theSinan02 »

Hocam yardımlarınız icin tşkler
Bazi ftplere baglanip bazi ftplere bağlanmaması neden yapar
FTP->Passive =true;
Gibi bişey yazmadım
Passive nin default değeri nedir bilemiyorum
Ancak ftp ip adresini kullanıcı adi ve parola bilgilerini doğru girdiğim (kontol icin notepad acip oraya yapistiriyorum)
halde

the parameter is incorrect

Hatası döndürüyor
Aynı bilgiler ile FileZilla dan bağlantı kuruyorum
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

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

Mesaj gönderen xozcanx »

Merhaba,
Hayırlı Haftalar.
Aldığınız uyarı parametrelerin hatalı olduğuna dair. Bazı FTP ler için bu sorunu yaşadığınızı belirtiyorsunuz.
Tek aklıma gelen olasılık ise bağlantı yapmak istediğiniz host için TLS/SSL protokolü olabileceği.
İyi Çalışmalar.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

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

Mesaj gönderen theSinan02 »

Hocam bilemiyorum
FileZilla bağladım ana dikkat etmedim yarın yine denicem
Eger oyle ise idftp ile nasil bağlantı kuracagim
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

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

Mesaj gönderen ertank »

Eğer sakıncası yok ise kod ve bağlanmak istediğiniz ftp sitesi bilgilerini paylaşabilir misiniz?
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

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

Mesaj gönderen theSinan02 »

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

//baglantı Fonksiyonum
// Bilgisayar Adı al Fonksiyonum var
Bu uygulama Bir Yedekleme Sistemi MSSQL ve FireBird veri Tabanlarını Otomatik Yedek Alıyor
Yedek Alırkende Klasör Yapısı
HedefKlasör içinde Bir Klasör daha Oluşturuyor Bu klasör Adını da Bilgisayar Adından Alıyor
Sonra içinde Bir Klasör Daha Yedeklemeyi Adını ve Tarihini Alıyor
Yani C:\Temp\Sinan-PC\SQLYEDEK_2017_10_31\Yedek.zip

Şeklinde Bir Yapı
Dosyayı FTP Atarkende BilgisayarAdı Klasörü ve Sonrasını Alıp FTP Dizin Varmı Yoksa Dizin Oluşturup Yedeği Yine Oraya Atıyorum

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);
			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_KLASOR_ICERIGI->Free();
							FTP_DIZINLER->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" ;
}


Fonksiyon Kullanımı

Kod: Tümünü seç


FTP_AKTARIM("5.2.84.41", "Karkas987654", "Karkas987654", false, "C:\Temp\Sinan-PC\SQLYEDEK_2017_10_31\Yedek.zip")
ancak bazı sunucularda çalıştıramadım
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

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

Mesaj gönderen ertank »

1-Kullandığınız CBuilder++ sürümü nedir?
2-Kullandığınız Indy (TIdFTP) sürümü nedir?
3-Bunun dışında TIdLogEvent tarafından (IdFTP->Intercept) oluşturulan bir dosya var mı? Sorununuz ile ilgili bu dosyayı paylaşmanız mümkün mü?

Hata mesajından anlaşıldığı kadarıyla Türkçe karakter sorunu yaşıyorsunuz. Yani, FTP bağlantısı kuruluyor. Ancak dizin listeleme, oluşturma veya değiştirme sırasında ilgili hata mesajı geliyor.

Bağlantı kurulduğunda FTP sunucunuz UTF-8 desteğine sahip olduğunu bildiriyor. Normalde TIdFTP bileşeninin de bunu algılayıp kendi içinde çözümlemesi gerekir. Ancak bir sebepten yapamamış. Sebebini anlamak için IdLogEvent log detayları incelenebilir. Normalde bu log içeriğinde giden ve gelen iletişime dair komutlar olması gerekir.

4-FileZilla ile sorun çıkmadan bağlanabildiğinizi söylüyorsunuz. FileZilla Türkçe karakter içeren dizin ve dosyaları indirme/yükleme yapabiliyor mu? Eğer FileZilla bunu yapabiliyor ise sunucunuz ile ilgili sorun olmadığını kesinlikle söylemek mümkün olacaktır. Eğer yapamıyor ise FTP sunucusu UTF-8 desteklediğini söylüyor, ancak dosya sisteminde özel karakterler içeren dosyaları doğru bir şekilde UTF-8 olarak dönüştüremiyor demektir. Mevcut sunucuyu UTF-8 desteği olan farklı bir sunucu ile değiştirmek gerekebilir.

Alternatif bir çözüm olarak kolay olacağına inanıyor iseniz HOST parametresi içinden Türkçe karakterleri İngilizce karşılıklarına değiştirerek mevcut kodunuzu kullanmanız mümkün olabilir.

Konudan bağımsız olarak kodunuzda gözüme çarpan bir konu: URL içinden host kısmını siz kendiniz bölmeye çalışmayın. TIdURI sınıfını kullanın. Örnek kullanım için aşağıdaki bağlantıdan faydalanabilirsiniz. Delphi kodunu CBuilder++ koduna çevirmeniz gerekecektir.
https://stackoverflow.com/questions/132 ... rl-to-root
theSinan02
Üye
Mesajlar: 28
Kayıt: 15 Eyl 2014 12:33

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

Mesaj gönderen theSinan02 »

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 dizin var mı yokmu kontrolu yapmam gerekiyor
dizin kontrolunu

Kod: Tümünü seç

TStringList *FTP_KLASOR_ICERIGI = new TStringList();
String List Oluşturduktan sonra

Kod: Tümünü seç

IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_DIZINLER->Strings[i],true);
ile Dizin içeriğinini Listeliyorum

Kod: Tümünü seç

if (FTP_KLASOR_ICERIGI->Count < 1 )
                                 //içerik yok ise 
				IdFTP1->MakeDir(FTP_DIZINLER->Strings[i]) ;
//dizin oluşturuyorum
IdFTP1->ChangeDir(FTP_DIZINLER->Strings[i]);
oluşturduğum dizine giriyorum

Hata Aldığım Satır

Kod: Tümünü seç

IdFTP1->List(FTP_KLASOR_ICERIGI,FTP_DIZINLER->Strings[i],true);
dizin kontrolunu başka nasıl yapabilirim
Cevapla