CYFROWY BARON • PROGRAMOWANIE • Zobacz wÄ…tek - Klient FTP - problem z wysyÅ‚em plików

Klient FTP - problem z wysyłem plików

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

Klient FTP - problem z wysyłem plików

Nowy postprzez grigorij89 » Å›roda, 11 maja 2011, 18:29

Mam problem z moim klientem FTP. Otóż wygląda to tak , że jeśli chodzi o wysyłanie i pobieranie plików tekstowych wszystko śmiga pięknie,ściągnięte pliki z serwera otwierają się bez problemu.Jednak jeśli chce wysyłam inny rodzaj plików np. jpg,doc, cokolwiek to po ściągnięciu na dysk i przy próbie otwarcia przeglądarka obrazów pokazuje błąd, że nie jest w stanie otworzyć pliku. Wydaje mi się że to wina leży przy wysyłaniu pliku raczej niż przy ściąganiu go . Korzystam z funkcji get() , a program piszę w RAD Studio 2010.
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez Darek_C++ » Å›roda, 11 maja 2011, 19:43

Powodem będzie wysyłanie/ściąganie wszystkich plików w trybie tekstowym, a nie binarny jaki jest wymagany dla jpg,doc.

FTP.TransferType:= ftASCII else FTP.TransferType := ftBinary;
indy ftp TransferType

Za ten post autor Darek_C++ otrzymał podziękowanie od:
grigorij89
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 - problem z wysyłem plików

Nowy postprzez grigorij89 » Å›roda, 11 maja 2011, 21:41

Dzięki za radę. Teraz mam pytanie jak rozpoznać jaki plik jest wysyłany/pobierany i ustawić odpowiednio tryb transmisji? Mam pomysł żeby sprawdzać w if'ie
rozszerzenie pliku ,tylko jaka funkcja wyłuskuje rozszerzenie pliku ?
Tak bym zrobił:
Kod: Zaznacz cały
if(! "txt") // tu funkcja zwracajÄ…ca rozszerzenie
IdFTP1->TransferType = ftBinary;

A wy jak myślicie?
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez Pitek » Å›roda, 11 maja 2011, 22:39

Do pobierania rozszerzenia pliku służy funkcja ExtractFileExt()
Przykład :
KOD cpp:   •  UKRYJ  •
String Extension = ExtractFileExt("C:\WINDOWS\explorer.exe");

Zawartością zmiennej Extension będzię w tym przypadku ".exe"
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl

Za ten post autor Pitek otrzymał podziękowanie od:
grigorij89
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez grigorij89 » Å›roda, 11 maja 2011, 23:27

Dzięki
niestety dalej mam to samo :( ciągle nie chce poprawnie otworzyć pliku
oto kawałki kodu:
Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)       // Å›ciÄ…ganie z serwera
{
   AnsiString path = Edit1->Text;                             // nazwa pliku + rozszerzenie
   if(SaveDialog1->Execute())
   {
      AnsiString path2 = SaveDialog1->FileName;      // path2-miejsce zapisu pliku
      AnsiString extension = ExtractFileExt(path);
      if(!(extension == ".txt"))
         IdFTP1->TransferType = ftBinary;
         else
         IdFTP1->TransferType = ftASCII;
      IdFTP1->Get(path, path2, true, false);    // pobieranie
    }
}

void __fastcall TForm1::Button3Click(TObject *Sender)   // wysyÅ‚ pliku na serwer
{
   if(OpenDialog1->Execute())      // wywoÅ‚anie okna dialogowego do otwarcia pliku ktory bedziemy wysylac na serwer
   {
      AnsiString fname = OpenDialog1->FileName;    //fname scieżka pliku na dysku do wysyÅ‚u
      AnsiString sname = ExtractFileName(fname);  // sname - nazwa pliku na serwerze
      AnsiString extension = ExtractFileExt(fname);  // extension - rozszerzenie pliku
      if(!(extension == ".txt"))
         IdFTP1->TransferType = ftBinary;
         else
         IdFTP1->TransferType = ftASCII;

      IdFTP1->Put(fname,sname,true);  // wysyÅ‚ pliku na serwer
   }
}
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez Pitek » czwartek, 12 maja 2011, 01:03

Taguj kod w znacznikach CPP, lepiej siÄ™ to czyta, pewnie ktoÅ› to poprawi ;)
Nie wydaje mi się żeby to było nie poprawne ale jakiś dziwny masz ten if twoim zapisem zaprzeczasz równość czyli wychodzi na zaprzeczenie, jakieś to zawiłe.
Zamiast tego : if(!(extension == ".txt")) użyj tego : if(extension != ".txt").
Analogicznie if(!(extension != ".txt")) to samo co if(extension == ".txt")
Chyba prościej nie ;)
Ale myślę że to nie tutaj jest błąd bo kod dla mnie wydaje się być w porządku ale niech ocenią mądrzejsi ode mnie, chyba błąd jest w innym kodzie lub w kodzie którego w ogóle nie ma czyli czegoś brakuje.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
PodziÄ™kowaÅ‚ : 43
OtrzymaÅ‚ podziÄ™kowaÅ„: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez grigorij89 » czwartek, 12 maja 2011, 15:45

Zmieniłem te moje dziwne warunki na != ,ale dalej to samo. Czyli wina jest gdzie indziej... tylko gdzie ?
Przy otwieraniu np zdjęcia pisze: "Przeglądarka fotografii systemu Windows nie może otworzyć tego obrazu, ponieważ nie obsługuje tego formatu pliku lub nie zainstalowano najnowszych aktualizacji." Hmmm dziwne..
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez Darek_C++ » czwartek, 12 maja 2011, 17:17

Dziwne...
Nie wykluczone, że masz zrywane połączenie i nie cały strumień pliku jest wysyłany przez co pojawia się problem o jakim Piszesz. Sprawdź dokładny rozmiar pliku po wysłaniu / ściągnięciu z oryginałem.
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 - problem z wysyłem plików

Nowy postprzez Cyfrowy Baron » czwartek, 12 maja 2011, 17:37

Problem występuje tylko wtedy gdy pliki są wysyłane jako pliki tekstowe, zmiana ustawień na wysyłanie binarne musi być dokonana jeszcze przed zrealizowaniem połączenia z serwer. Jeżeli połączenie realizowane było z właściwością TransferType ustawioną na ftASCII, to po połączeniu zmienianie właściwości TransferType na ftBinary nic już nie zmienia pliki są pobierane jak pliki tekstowe, ale wysyłane są jako pliki binarne. Niezależnie od tego ustawienia pliki są wysyłane prawidłowo, problem stanowi pobieranie, dlatego należy właściwość TransferType ustawić trwale na ftBinary. Pliki tekstowe również mogą być pobierane binarnie. ftBinary to transfer 8 bitowy, a ftASCII to transfer 7 bitowy i jeżeli nie ma jakichś szczególnych powodów, to nie należy używać transferu w trybie ftASCII.

W załączniku projekt z przykładowym programem stworzony w środowisku Embarcadero RAD Studio C++Builder 2010. U mnie na serwerze programowanie.cal.pl działa prawidłowo.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
grigorij89
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
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 - problem z wysyłem plików

Nowy postprzez grigorij89 » sobota, 14 maja 2011, 14:31

Dobra testowałem i okazało się że wszystko w moim programie jest ok. Faktycznie lepiej jednak ustawić TransferType na ftBinary. Okazało się też , że problem leżał po stronie serwera, zmieniłem na cba.pl i tam ładnie wysyła i pobiera każdy typ pliku. Dziękuję wszystkim za pomoc.

@Edit
Mam jeszcze jeden problem, który bardzo mnie irytuje. Gdy włączam program i klikam przycisk Pokaz (po to by wyświetlić listę plików) i chce coś pobrać/wysłać z serwera plik to znowu jest tak że źle wysyła/pobiera ten plik tak jakby znowu był TransferType na ASCII. Dodam, że jak nie robię operacji wyświetlana listy plików tylko normalnie chcę coś wysłać/pobrać to wszystko jest ok, plik pobranie jest pobierany i da się go otworzyć. Załączam plik z kodem może ktoś odnajdzie buga :(
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
grigorij89
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): czwartek, 14 kwietnia 2011, 19:19
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Windows 7
Ubuntu 10.10
Kompilator: Embarcadero RAD Studio 2010
Visual Studio 2008
Gadu Gadu: 8442357
    Windows 7Firefox

Re: Klient FTP - problem z wysyłem plików

Nowy postprzez Cyfrowy Baron » Å›roda, 18 maja 2011, 11:00

Co się tyczy tego problemu z wyliczaniem plików i ponownym wysyłaniem - odbieraniem, to w pliku pomocy można przeczytać:


Prior to executing the LIST command, the TransferType for the control channel is set to ftASCII. While this is not a requirement of the FTP protocol, it is a common practice in most FTP clients. The previous value of the TransferType property is restored before exiting from the List method.



Tłumaczenie:

Przed wykonaniem polecenia LIST, TransferType jest zmieniane na ftASCII. Choć nie jest to wymóg protokołu FTP, jest to powszechną praktyką w większości klientów FTP. Poprzednia wartość TransferType jest przywracana przed wyjściem z metody List.



Czyli teoretycznie typ Transferu powinien zmienić się na wcześniejszy czyli na ftBinary. Testy jednak pokazuję, że tak nie jest. Tak więc jest to jakiś bug tej biblioteki.
Jedyny sposób w jaki można to obejść, to po pobraniu listy plików rozłączyć się i ponownie połączyć. Innego sposobu na razie nie widzę, a i w sieci nie znalazłem żadnego rozwiązania.

KOD cpp:   •  UKRYJ  •
 IdFTP1->List(ListBox2->Items, "", false);
 IdFTP1->Disconnect();
 IdFTP1->Connect();


Niestety katalog się zmieni i trzeba go ponownie przywrócić.
Chętnie poznam rozwiązanie tego problemu, jeżeli ktoś przypadkiem je zna...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • 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 5 gości