CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Klient FTP - button start/stop

Klient FTP - button start/stop

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Klient FTP - button start/stop

Nowy postprzez shimmo » czwartek, 10 lutego 2011, 15:52

Witam, piszę klienta FTP z pomocą poradnika dostępnego na stronie (Borland Builder C++ 6 + Indy 9), mam jednak pytanie. W jaki sposób zrobić tak był do łączenia i rozłączenia z serwerem FTP służył ten sam button? Chciałbym, żeby wyglądało to tak:
Gdy nie jestem podłączony to pisze na nim Połącz oraz ikonka połączenia, po kliknięciu na niego klient łączy się. Gdy jest podłączony, napis zmienia się na Rozłącz i ikonkę rozłączenia, gdy się na niego naciśnie klient rozłącza się.

Proszę o pomoc, gdyż szukałem ale nie umiem sobie sam z tym problemem poradzić :) Pozdrawiam!

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::LoadFileFrom(TObject *Sender){

}
//---------------------------------------------------------------------------



void __fastcall TForm1::AnonymCheckClick(TObject *Sender)
{
        UserEdit->Text="anonymous";
        IdFTP1->Username="anonymous";
        PasswordEdit->Text="";
        IdFTP1->Password="";
}
//---------------------------------------------------------------------------




void __fastcall TForm1::ConnectBtnClick(TObject *Sender)
{
        if(IdFTP1->Connected()) {

        }else{
        IdFTP1->Host=HostEdit->Text;
        IdFTP1->Port=StrToInt(PortEdit->Text);
        IdFTP1->Username=UserEdit->Text;
        IdFTP1->Password=PasswordEdit->Text;
        try
        {
        IdFTP1->Connect();
        StatusBar1->SimpleText="Połączono!";
        ConnectBtn->Glyph=NULL;
        ImageList1->GetBitmap(1, ConnectBtn->Glyph);
        ConnectBtn->Caption="Rozłącz";
        }
        catch(...)
        {
         ShowMessage("Nie udało się zalogowac, sprawdź poprawnosc danych");
        }

   }

}
//---------------------------------------------------------------------------



void __fastcall TForm1::Button2Click(TObject *Sender)
{

IdFTP1->List(ListBox1->Items, "*.*", false);

}
//---------------------------------------------------------------------------



void __fastcall TForm1::DownloadBtnClick(TObject *Sender)
{
IdFTP1->Get("wymiana/abc.txt", "C:\\test.txt", true,false);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::UploadBtnClick(TObject *Sender)
{
IdFTP1->Put("C:\\folder\\dddd.txt", "wymiana/buuu.txt", true);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RemoveBtnClick(TObject *Sender)
{
IdFTP1->Delete("wymiana/yy.txt");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::NameBtnClick(TObject *Sender)
{
IdFTP1->Rename("wymiana/yy.txt", "wymiana/blee.txt");
}
//---------------------------------------------------------------------------


void __fastcall TForm1::IdFTP1Status(TObject *ASender,
      const TIdStatus AStatus, const AnsiString AStatusText)
{
ListBox1->Items->Add(IntToStr(AStatus)+". " + AStatusText);
Application->ProcessMessages();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::LoadBtnClick(TObject *Sender)
{
IdFTP1->List(ListBox2->Items, "*.*", false);
}
//---------------------------------------------------------------------------
 
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 11:23

Do sterowania przyciskiem należy posłużyć się zdarzeniem OnStatus obiektu IdFTP1:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ConnectBtnClick(TObject *Sender)
{
 if( !IdFTP1->Connected() )
 {
  IdFTP1->AutoLogin = true;
  IdFTP1->Host = "nazwa hosta";
  IdFTP1->Username = "nazwa użytkownika";
  IdFTP1->Password = "hasło";
  IdFTP1->Connect();
 }
 else
 {
  IdFTP1->Disconnect();
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdFTP1Status(TObject *ASender, const TIdStatus AStatus,
          const UnicodeString AStatusText)
{
 switch(AStatus)
 {
   case 0: /* pozostawić puste, przechodzi na case 3 - pozyskiwanie adresu - hsResolving */
   case 1: /* pozostawić puste, przechodzi na case 3 - otwieranie połączenia - hsConnecting */
   case 2: /* pozostawić puste, przechodzi na case 3 - wykonano połączenie - hsConnecdet */
   case 3: ConnectBtn->Enabled = false; ConnectBtn->Caption = "Czekaj..."; break; /* rozłączanie - hsDisconnecting */
   case 4: ConnectBtn->Enabled = true;  ConnectBtn->Caption = "Połącz"; break; /* rozłączono - hsDisconnected */
   case 6: ConnectBtn->Enabled = false; ConnectBtn->Caption = "Transfer"; break; /* rozpoczęcie transfetu - ftpTransfer */
   case 7: /* pozostawić puste, przechodzi na case 8 - połączenie gotowe do pracy oraz zakończono transfer - ftpReady */
   case 8: ConnectBtn->Enabled = true;  ConnectBtn->Caption = "Rozłącz"; break; /* przerwano transfer - ftpAborted */
 }
 Application->ProcessMessages();
}




Uzupełnij profil by było widać z jakiego systemu korzystasz i w jakim środowisku programujesz.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
shimmo
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez shimmo » piątek, 11 lutego 2011, 12:43

Dzięki Baronie za odpowiedź, jednak gdy chcę skompilować twój kody wyskakuje mi błąd:


[C++ Error] Unit1.cpp(76): E2316 'AutoLogin' is not a member of 'TIdFTP'




EDIT:
Po zakomentowaniu tego ruszyło i działa! Dzięki ogromne :)
Mam jeszcze kilka pytań ale chyba lepiej założę nowy temat, żeby nie śmiecić.
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 13:04

Dzięki Baronie za odpowiedź, jednak gdy chcę skompilować twój kody wyskakuje mi błąd:

[C++ Error] Unit1.cpp(76): E2316 'AutoLogin' is not a member of 'TIdFTP'



Funkcja automatycznego logowania nazywa się po prostu inaczej. W każdym bądź razie musisz wiedzieć, że automatyczne logowanie musi być włączone w przeciwnym razie połączysz się z kontem, ale niczego z niego nie pobierzesz ani nie wyślesz na nie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez shimmo » piątek, 11 lutego 2011, 13:50

Hmm szukałem jakieś funkcji na kształt AutoLogin i nic tam podobnego nie widziałem, ale może coś przeoczyłem, bo dopiero co zaczynam zabawe z "takim" programowaniem.
Dodam, że mam na virtualnej maszynie postawiony serwer ftp na linuksie, i bez AutoLogin klient FTP łączy mi się, pobiera i wysyła pliki. Czy ten AutoLogin jest naprawde potrzebny? Pytam bo chyba wszystko mi działa a nie znam się :)
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 14:38

Zrób zrzut ekranu okna Object Inspector z zakładką Properties dla IdFTP1.

properties.png


Dodam, że mam na virtualnej maszynie postawiony serwer ftp na linuksie, i bez AutoLogin klient FTP łączy mi się, pobiera i wysyła pliki.


Przypuszczam, że podobnie jak to jest w INDY 10 automatyczne logowanie jest domyślnie włączone, dlatego wszystko działa. Możliwe jest też, że w starszych wersjach INDY nie ma funkcji rozdziału na logowanie i automatyczne logowanie.

Przy wyłączonym Automatycznym logowaniu chcąc by zalogowało mnie od razu po połączeniu z hostem musiałbym wywołać funkcję logującą:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ConnectBtnClick(TObject *Sender)
{
 if( !IdFTP1->Connected() )
 {
  IdFTP1->Host = "host";
  IdFTP1->Username = "nazwa użytkownika";
  IdFTP1->Password = "hasło";
  IdFTP1->Connect();
 }
 else
 {
  IdFTP1->Disconnect();
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdFTP1Status(TObject *ASender, const TIdStatus AStatus,
          const UnicodeString AStatusText)
{
 switch(AStatus)
 {
   case 0: /* pozostawić puste, przechodzi na case 3 - pozyskiwanie adresu - hsResolving */
   case 1: /* pozostawić puste, przechodzi na case 3 - otwieranie połączenia - hsConnecting */
   case 2: /* pozostawić puste, przechodzi na case 3 - wykonano połączenie - hsConnecdet */
   case 3: ConnectBtn->Enabled = false; ConnectBtn->Caption = "Czekaj..."; break; /* rozłączanie - hsDisconnecting */
   case 4: ConnectBtn->Enabled = true;  ConnectBtn->Caption = "Połącz"; break; /* rozłączono - hsDisconnected */
   case 6: ConnectBtn->Enabled = false; ConnectBtn->Caption = "Transfer"; break; /* rozpoczęcie transfetu - ftpTransfer */
   case 7: /* pozostawić puste, przechodzi na case 8 - połączenie gotowe do pracy oraz zakończono transfer - ftpReady */
   case 8: ConnectBtn->Enabled = true;  ConnectBtn->Caption = "Rozłącz"; break; /* przerwano transfer - ftpAborted */
 }
 Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdFTP1BannerBeforeLogin(TObject *ASender,
        const UnicodeString AMsg)

{
 IdFTP1->Login();
 ConnectBtn->Enabled = true;
 ConnectBtn->Caption = "Rozłącz";
}


To dotyczy jednak INDY 10, więc u Ciebie może być inaczej.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez shimmo » piątek, 11 lutego 2011, 15:33

Tak to wygląda u mnie.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 15:49

Miała być cała zakładka Properties (Events - zbędna), bo na rysunku pasków sobie nie przewinę. W sumie skoro kod Tobie działa to już nieistotne.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez shimmo » piątek, 11 lutego 2011, 16:14

Obrazek

Przepraszam bardzo, moje niedopatrzenie.
Hmm niby mi to działa ale na swoim serwerze ftp (mam ustawione uprawniena 777 do katalogu). Założyłem natomiast darmowy hosting, żeby sprawdzić jak działa zewnętrzne ftp i już nie jest tak różowo, nie mam chyba praw dostępu. Tzn z filezilla wszystko się ściąga i wysyła, natomiast z mojego klienta nie mogę wrzucać nic na serwer. Problem więc chyba jednak istnieje :P
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 16:32

Po połączeniu spróbuj wywołać logowanie.

KOD cpp:     UKRYJ  
IdFTP1->Login();


Jeżeli wyskoczy komunikat, że jesteś już zalogowany to oznacza, że automatyczne logowanie działa prawidłowo, jeżeli komunikatu nie będzie to po takim logowaniu spróbuj wysłać plik. Jeżeli wysłanie się nie powiedzie, to masz źle ustawiony katalog zdalny, czyli nie wysyłasz pliku prawidłowo.
W hostingu cal.pl z którego ja korzystam zdalny katalog jest pod adresem: domains/programowanie.cal.pl/public_html/forum/. Na 90 precent kopiujesz plik do nieprawidłowej lokalizacji.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
shimmo
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Darek_C++ » piątek, 11 lutego 2011, 16:32

Ja do wysyłania na "produkcyjne" serwery FTP używam następującego kodu i działa bez zastrzeżeń:
KOD cpp:     UKRYJ  
TIdFTP *IdFTP1 = new TIdFTP(NULL);
IdFTP1->Username = LabeledEdit5->Text.Trim();
IdFTP1->Password = LabeledEdit6->Text.Trim();
IdFTP1->Host = LabeledEdit7->Text.Trim();
IdFTP1->Passive = true;
IdFTP1->Port = LabeledEdit8->Text.Trim().ToInt();
try
{
        IdFTP1->Connect(true,5000);
}
catch (Exception &exception)
{
        ShowMessage(exception.Message);
}

if(IdFTP1->Connected())
{

        IdFTP1->ChangeDir(LabeledEdit9->Text.Trim());
        IdFTP1->Put(LabeledEdit10->Text, nazwa, False);

        if(IdFTP1->Size(nazwa) == FileSizeByName(nazwa) )
        {
                StatusBar1->Panels->Items[0]->Text="Plik został wysłany na serwer: "+IntToStr(IdFTP1->Size(nazwa)) ;
                Application->MessageBox("Plik został wysłany na serwer", "Komunikat",MB_ICONINFORMATION);
        }
        IdFTP1->Disconnect();

}

delete IdFTP1;
W tym wypadku nie jest to połączenie szyfrowane wiec nr portu jest standardowy 21.

Za ten post autor Darek_C++ otrzymał podziękowanie od:
shimmo
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez shimmo » piątek, 11 lutego 2011, 16:50

Po dodaniu
KOD cpp:     UKRYJ  
IdFTP1->Login();


Dostaję error:

You are already logged in!


Więc widocznie wszystko jest tak jak należy.
Zmieniłem uprawnienia na moim serwerze dla katalogu na 700 i wszystko działa, założyłem dodatkowo konto na innym hostingu i już wszystko śmiga! :)
Dzięki wielkie!

Darek dzięki, przeanalizuję sobie Twój kod i może czegoś nowego się nauczę.
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 16:59

Dostaję error:

You are already logged in!



To nie błąd lecz komunikat, że jesteś już zalogowany, więc auto-logowanie przebiega prawidłowo.

Zmieniłem uprawnienia na moim serwerze dla katalogu na 700 i wszystko działa, założyłem dodatkowo konto na innym hostingu i już wszystko śmiga! :)


Ustawienie atrybutów na 700 daje dostęp do katalogu tylko przez protokół FTP po zalogowaniu. Jeżeli chcesz umieścić na tym koncie stronę WWW to musisz ustawić atrybut na 755.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez shimmo » piątek, 11 lutego 2011, 17:08

Ustawienie atrybutów na 700 daje dostęp do katalogu tylko przez protokół FTP po zalogowaniu. Jeżeli chcesz umieścić na tym koncie stronę WWW to musisz ustawić atrybut na 755.


Tak tak, wiem o tym, jednak zmieniłem uprawnienia na 700 by mieć pewność, że to właśnie właściciel ma tylko prawa (chciałem sprawdzić, czy faktycznie loguję się nako użytkownik).

Tak z innej beczki teraz, moglibyście podrzucić mi jakiś pomysł w jaki sposób zrealizować to, by użytkownik podczas działania programu decydował jaki plik ma być wysłany(i gdzie), analogicznie to samo bym chciał zrobić dla zapisuj pliku z serwera.
Chciałbym także, zrobić wyświetlanie zawartości katalogu na serwerze, coś na kształt tak jak jest to zrobione w chociażby filezilla:
Obrazek
Przy czym wystarczy mi lista plików wraz z nazwą i ikonkami tylko.
Mam to teraz zrobione w ListBox, ale on nie wyświetla mi folderów, ikonek. Chciałbym także, by dało się wejść do wyświetlonych folderów.

Szukałem już, ale nie znalazłem nic zbytnio :(
Avatar użytkownika
shimmo
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): czwartek, 10 lutego 2011, 15:46
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP Home
Kompilator: Borland Builder C++ 6
Gadu Gadu: 0
    Windows XPFirefox

Re: Klient FTP - button start/stop

Nowy postprzez Cyfrowy Baron » piątek, 11 lutego 2011, 17:30

Tak z innej beczki teraz, moglibyście podrzucić mi jakiś pomysł w jaki sposób zrealizować to, by użytkownik podczas działania programu decydował jaki plik ma być wysłany(i gdzie), analogicznie to samo bym chciał zrobić dla zapisuj pliku z serwera.


Nie zrozumiałem.

Chciałbym także, zrobić wyświetlanie zawartości katalogu na serwerze, coś na kształt tak jak jest to zrobione w chociażby filezilla:


viewtopic.php?f=16&t=1052&p=6961&#p6957

► patrz serwis: Cyfrowy Baron dział: porady -> różne -> Wyświetlanie ikon skojarzonych z plikiem lub folderem.; porady -> sieć - internet -> Ściąganie i wysyłanie plików poprzez protokół FTP.; porady -> ListView.

Na rysunku znajduje się lista typu TListView.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron