Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idFTP: Download funktioniert nur in lokalem Netz (https://www.delphipraxis.net/158562-idftp-download-funktioniert-nur-lokalem-netz.html)

FBrust 22. Feb 2011 12:29

idFTP: Download funktioniert nur in lokalem Netz
 
Hallo,

ich möchte einen FTP-Download durchführen, allerdings funktioniert er nur im lokalen Netz.

Das im Code aufgeführte Formular soll die Datei herunterladen. Sobald der Download übers Internet durchgeführt werden soll, wird im Zielverzeichnis eine 0-Byte-Datei gleichen Namens angelegt und das Programm reagiert nicht mehr.

Der FTP-Server (hier FileZilla) zeigt jedoch an, dass der Transfer ordnungsgemäß stattfindet. :?:

Hier der code:

Delphi-Quellcode:
procedure TfrmDownload.btnCancelClick(Sender: TObject);
begin
    frmMain.IdFTP1.Abort;
    Close;
end;

procedure TfrmDownload.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    Action := caFree;
    frmDownload := nil;
end;

procedure TfrmDownload.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
    pbDL.Position := aWorkCount;
    Application.ProcessMessages;

end;



procedure TfrmDownload.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
    pbDL.Max := IdFTP1.Size('Downloads\' + strProgFile); ;

end;



procedure TfrmDownload.FormActivate(Sender: TObject);
var strDestFile  : string;
    lStream      : TFileStream;
    strMsg       : string;
    qryTemp      : TIBCQuery;
begin
    qryTemp := TIBCQuery.Create(Application);
    with qrytemp do
    begin
      Connection := dmFBData.ConData;
      SQL.Text := 'SELECT INTMWMAIL, INTMWFTP, STRFTPHOST, STRFTPUSER, ' +
                  'STRFTPPW, INTFTPPORT ' +
                  'FROM SD_PARAMS';
      try
        Open;
        idFTP1.Host := FieldbyName('STRFTPHOST').AsString;
        idFTP1.Username := FieldbyName('STRFTPUSER').AsString;
        idFTP1.Password  := FieldbyName('STRFTPPW').AsString;
        idFTP1.Port := FieldbyName('INTFTPPORT').AsInteger;
        Close;
      except
        on E:Exception do
        begin
          strMsg := 'Fehler bei Ermittlung FTP-Daten, Meldung: ' + E.Message;
          ShowWarningEx(strMsg);
        end;
      end;
      Free;
    end;


    strDestFile := GetSpecialFolderLocation($23) + 'test\Updates\' + strProgFile;
    lStream := TFileStream.Create(strDestFile, fmCreate or fmShareDenyNone);
    try
      idFTP1.Connect;
      Application.ProcessMessages;
      idFTP1.Get('Downloads\' + strProgfile, lStream);
    except
      on E:Exception do
      begin
        ShowWarningEx('Fehler bei Download, Meldung: ' + E.Message);
        lStream.Free;
        idFTP1.Disconnect;
        Exit;
      end;
    end;
    idFTP1.Disconnect;
    lStream.Free;
    strMsg := 'Download beendet. ' + #13#10#13#10 +
              'Das Programm wird nun beendet und aktualisiert. Nach der ' +
              'Aktualisierung wird es neu gestartet.';
    ShowInfo(strMsg);
    RunAndWaitShell(strDestFile, ' /sp- /silent', 0);
    Close;

    frmMain.Close;

end;
Wie gesagt, im lokalen Netzt läuft alles prima. Die Ordnerstruktur ist auch identisch, d. h. die Quell- und Zielordner sind beide vorhanden.

Hat vielleicht jemand einen Tip?

Gruß
Frank

chrisw 22. Feb 2011 12:37

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Dreh doch mal das
Delphi-Quellcode:
lStream.Free;
und das
Delphi-Quellcode:
idFTP1.Disconnect;
um, vielleicht hilft das !

FBrust 22. Feb 2011 12:49

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Hallo,

danke für Deine Antwort, hab die beiden Anweisungen vertauscht, leider ohne Erfolg.

Ich hab mal den Rest der Funktionen in obigem Code hinzugefügt, um zu zeigen, was sonst noch passiert. Die Progressbar fängt garnicht erst an zu "laufen", obwohl wie gesagt laut FileZilla-Server der Transfer stattfindet.



Gruß
Frank

Luckie 22. Feb 2011 12:54

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Technisch gesehen gibt es zwischen LAN und WAN keinen Unterschied. Kann es sein, dass eventuell die Firewall dazwischen funkt?

chrisw 22. Feb 2011 12:55

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Musst du da nicht auch mit OnAfterGet bzw OnStatus arbeiten ? (siehe idFTP.Get Hilfe)

Indy ist doch m.E. Threaded aufgebaut, oder ?

FBrust 22. Feb 2011 13:03

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Hallo,

@Luckie: in beiden Firewalls ist Port 21 freigegeben, sollte also funktionieren, zumal der Connect ja funktioniert.

@ChrisW: dann dürfte es im lokalen Netz auch nicht funktionieren, da, wie Luckie sagt, technisch kein Unterschied zwischen LAN und WAN ist.

Ich werd mal prüfen, ob die Size-Anweisung überhaupt einen korrekten Wert liefert oder ob es da schon hapert.

Edit: Eine direkt nach idFTP1.Size... einfügte Messagebox erscheint garnicht erst...seltsam.

Gruß
Frank

Luckie 22. Feb 2011 13:05

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Bei einer aktiven Verbindung, im Gegensatz zu einer passiven, werden die Daten aber auf einem anderen Port übertragen, wenn ich mich da nicht täusche.

shmia 22. Feb 2011 13:08

AW: idFTP: Download funktioniert nur in lokalem Netz
 
FTP kann man Passiv und Aktiv betreiben.
Beim aktiven Betrieb werden Steuerbefehle über den Port 21 übertragen.
Der eigentliche Dateitransfer findet aber über Port 20 statt.
Wenn die Firewall den Port 20 blockiert kann genau das beobachte Verhalten eintreten.

GHorn 22. Feb 2011 13:26

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Hallo,

versuch mal folgende Einstellung/Erweiterung:

Delphi-Quellcode:
// Verbindung zum Server aufrecht erhalten:
idFTP1.Noop;
// Paramter "False" mit angeben:
idFTP1.Get('Downloads\' + strProgfile, lStream, False);

Luckie 22. Feb 2011 14:23

AW: idFTP: Download funktioniert nur in lokalem Netz
 
Zitat:

Zitat von shmia (Beitrag 1083501)
FTP kann man Passiv und Aktiv betreiben.
Beim aktiven Betrieb werden Steuerbefehle über den Port 21 übertragen.
Der eigentliche Dateitransfer findet aber über Port 20 statt.
Wenn die Firewall den Port 20 blockiert kann genau das beobachte Verhalten eintreten.

Danke für die weitergehende Erläuterung.

Jetzt stellt sich die Frage was bei den Komponenten im Objekinspektor eingestellt ist. Das sieht man ja leider hier nicht. Und da, wie schon gesagt, es keinen technischen unterschied zwischen LAN und WAN gibt, muss irgendwas die Übertragung beeinflussen. Firewall fällt mir bei so was immer als erstes ein. Eventuell ist es auch ein Proxy, falls einer verwendet wird oder der Rechner, über den die Verbindungen nach außen gehen. So genau kenne ich mich mit den Aufbau von Netzwerken nicht aus. Eventuell kann hier noch mal jemand ein paar mögliche Fehlerquellen nennen, der sich mit Netzwerken und deren Aufbau besser auskennt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz