Wysyłanie obrazków na serwer FTP za pomocą indy10

Wysyłanie obrazków na serwer FTP za pomocą indy10
Reiko
  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć,

ostatnio na szybko zrobiłem prosty program, który ma mi pomóc przy wrzucaniu treści do social mediów poprzez stronę WWW. Mniejsza o szczegóły - mam problem z umieszczaniem obrazków na serwerze FTP. Do wysyłania plików używam takiego oto kodu (korzystam z Indy10):

Kopiuj
function FTPWyslijPlik (zrodlo, cel:string; host: string; user: string; haslo: string): boolean;
var
  FTP: TIdFTP;
begin
  FTP := TIdFTP.Create(nil);
  FTP.Host     := host;
  FTP.Username := user;
  FTP.Password := haslo;
  FTP.Passive := true;
   try
      FTP.Connect();
      FTP.Put(zrodlo, cel);
      if FTP.Connected = true then FTP.Disconnect;

      result := true;
   except
      on exception do result := false;
   end;

  FTP.Free;
end;

Problem w tym, że plik typu plik HTML strony WWW przesyłany jest poprawnie, natomiast grafika na stronie nie jest wyświetlana. Lokalnie (na komputerze) strona wraz z grafiką jest poprawnie wyświetlana. Natomiast po przesłaniu plików na serwer FTP, strona wyświetla wszystko tylko nie grafikę. Gdy porównywałem wielkość pliku graficznego lokalnie i po przesłaniu tą metodą, wówczas plik po przesłaniu jest mniejszy (ucięty?) niż plik, który mam lokalnie. Na początku myślałem, że to wina serwera FTP, natomiast próbowałem tego samego w innym serwisie i problem ponownie występuje.

Czy ta metoda przesyłania plików ma jakąś wadę? W kodzie mam błąd?

Pozdrawiam!

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
7

Pliki binarne powinieneś wysyłać w trybie binarnym:

Kopiuj
FTP.TransferType := ftBinary;
Reiko
  • Rejestracja: dni
  • Ostatnio: dni
0

@Patryk27: Dzięki wielkie!

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
6

Jeszcze taka mała sugestia, co do tego kawałka:

Reiko napisał(a):
Kopiuj
   except
      on exception do result := false;
   end;

Używasz konstrukcji on * do, choć tak naprawdę jej nie używasz – nie jest ona potrzebna do ustawienia rezultatu metody. W tym przypadku wystarczy napisać po prostu:

Kopiuj
except
  Result := False;
end;

Konstrukcja on * do przydaje się podczas selektywnej obsługi wyjątków:

Kopiuj
except
  on EZeroDivide do
  begin
    // błąd dzielenia przez zero
  end;
  on ERangeError do
  begin
    // błąd związany z zakresem
  end;
end;

a także wtedy, kiedy jest potrzebny obiekt wyjątku (np. w celu odczytania z niego danych takich jak komunikat lub w celu przekazania go np. w parametrze innej metody):

Kopiuj
except
  on E: Exception do // jako ogólny wyjątek
    DoSomething(E); // przekazanie obiektu wyjątku
end;

No i też warto zaznaczyć, że dostęp do ostatnio wywołanego wyjątku (a nawet do całego ich stosu) jest możliwy z dowolnego miejsca projektu – wystarczy skorzystać z funkcji ExceptObject i temu podobnych globali.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.