Autor Beitrag
Christi
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 17.09.08 17:06 
Hallo DF,

ich habe ein problem mit der Indy FTP Client Komponente. Zum Dateitransfer nutze ich 5 Routinen.
1.) konfiguriert den FTP Client der auf dem Form liegt.
2.) laegt Dateinamen mit Pfaden fuer Source und Dest. Seite in Stringlists ab.
3.) nimmt den konfigurierten FTP client und verbindet.
4.) durch die AfterClientLogin funktion warte loese ich dasn das abarbeiten der hinterlegten Datein aus. Sobald der put befehl zurueck kommt wird das naechste file uebertragen, bis die liste leer ist.
5.) eine Close routine die den offenen ftp client mit Quit schliesst.

Das Problem :

Wenn ich Dateien mittels uplaod tranferiere , z.b. Jpegs dann kommen sie verstuemmelt mit Grafiksalat auf dem FTP Server an. Mit einem kommerziellen Client geht das ohne Probleme. Der Fehler ist bei wiederholten transfer der gleichen Datei immer an der gleichen Stelle.Ändert isch die Groesse ändert sich auch die stelle ab der Grafiksalat entsteht.
Textdateien(Unixformat) werden ob, klein oder 100kb gross ohne Fehler im binary mode transferiert!

Nebeneffekt:
Wenn ich nach dem letzten transfer die Verbindung mit Quit beende erhalte ich eine Fehlermessagebox "nicht verbunden!"
Diese Problem habe ich im forum gefunden. Aber die loesung alle in eine Zeile zu schreiben habe ich durch die Dateilisten nciht.
Auch kommt der FTP client nach einem Connect nie in die routine in der er den Connect ausfuehrte zurueck.
Antifreeze ist natuerlich enthalten!

Hat eine zuendene Idee?

ich bin fuer jeden einfall dankbar weil ich nicht mehr wieter weiss.

gruss

HB



ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
Function TF_GC_FTP_UpDown.SingleFTPClient_DefineServer(SystemTypeNo:integer; DestIP,DestUserName,DestUserPass:String; DestPort:Integer = 21):Integer; 
var
SystemNo:integer;
edcftp   : TIdFTP;   //SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo:integer)
begin
    Result := -1// default
    edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo);     // Pointer auf korrekten ftp Client holen
    if (edcftp<>niland (FTP_ClientData[SystemTypeNo].Created) then begin
          // FTP Client Verbindungsdaten hinterlegen
                edcftp.Host           := DestIP; // fremde IP
                edcftp.Port           := DestPort;
                edcftp.Username       := DestUserName;
                edcftp.Password       := DestUserPass;
                edcftp.Passive        := false;  // erstmal nur activ
                edcftp.Passive        := true;  // erstmal nur activ                
 //               edcftp.OpenWriteBuffer(-1);      // schaltet Indy eigenen Buffer aus
                edcftp.TransferType   := ftBinary;
//                edcftp.OnConnected    := IdFTP_OnConnected;  //SimpleFTP_Upload.
                edcftp.OnAfterClientLogin := SingleFTP_OnAfterClientConnect;
                edcftp.Intercept      := FTPLogEvent;
//                edcftp.Connect(True,5000);
                Result := 0// default
                FTP_ClientData[SystemTypeNo].Configured :=true;
                edcftp := nil;
      end else begin // wenn nicht korrekt alles konfiguriert und erstellt wurde  eine Fehlermitteilung machen und fertig


      end;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Function TF_GC_FTP_UpDown.SingleFTPClient_AddUploadFile(SystemTypeNo:Integer; SourceFileWithFullPath,DestFileWithFullPath:String):boolean;
begin
    Result := false;      // default
    if (SourceFileWithFullPath=''or (DestFileWithFullPath=''then exit;
    if FTP_ClientData[SystemTypeNo].Created then begin
          with FTP_ClientData[SystemTypeNo] do begin
                cftpUp_FilesListSource.Add(SourceFileWithFullPath);
                cftpUp_FilesListDest.Add(DestFileWithFullPath);
                cftpUp_StatusList.Add(CoStr_FTP_Waiting);
                Result := true;
            end;
      end;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function TF_GC_FTP_UpDown.SingleFTPClient_DefineDServer_Connect(SystemTypeNo:integer):boolean;
var
SystemNo:integer;
edcftp   : TIdFTP;
begin
    Result := false; // default
    edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo);     // Pointer auf korrekten ftp Client holen
    if (edcftp<>niland (FTP_ClientData[SystemTypeNo].Created) then begin
                edcftp.Connect; // (true,-1); //<--- Nachdem das Connect ausgeloest wird kehrt der debuger nie wieder in diese Routine zurueck, auch nciht nach einem Disconnect.
                Result := true; // default
                edcftp.quit;
                edcftp := nil;
      end else begin 


      end;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Procedure TF_GC_FTP_UpDown.SingleFTP_OnAfterClientConnect(Sender: TObject);
var
SenderName:String;
SenderID,SystemTypeNo,SystemNo:Integer;
edStrList_1,edStrList_2,edStrList_3:TTNTStringlist;
begin
   // vom Sender ausgehend definieren welche FTP client weiter bedient werden muss
   SystemNo :=0// unbenutzt bisher
    if (Sender is TIdFTP) then begin
        //  [..] ID des FTP clients ermitteln
          if (SystemTypeNo>0then begin // FTP Client gefunden
                if ( SingleFTPClient_DoNextUpload(SystemTypeNo,SystemNo)<0
      then ShowMessage('Fehler beim Upload auf '+ SenderName+'.');
                //Nun wenn alles fertig ist Verbindung schliessen
                SingleFTPClient_DefinedServer_DisConnect(SystemTypeNo); 
            end;
      end;
end;


Die Funktion SingleFTPClient_DoNextUpload(SystemTypeNo,SystemNo) macht den eigenlich Transfer.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
Function TF_GC_FTP_UpDown.SingleFTPClient_DoNextUpload(SystemTypeNo,SystemNo:integer):integer;   
var
Entry,MinEntries:Integer;
edcftp   : TIdFTP;   
begin
    Result:= -1// Default
    edcftp   := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo);
    if (edcftp<>nilthen begin
          if (not edcftp.Connected) then edcftp.Connect;
          if edcftp.Connected then begin
                Result:=0;
                with FTP_ClientData[SystemTypeNo] do begin
                      if (cftpUp_FilesListSource.Count < cftpUp_FilesListDest.Count)
                          then MinEntries :=cftpUp_FilesListSource.Count else MinEntries := cftpUp_FilesListDest.Count;   // nimalanzahl aneintragen
                      for Entry:= 0 to MinEntries-1 do begin
                            if ( cftpUp_StatusList.Strings[Entry] = CoStr_FTP_Waiting) then begin
                                  cftpUp_StatusList.Strings[Entry]:=  CoStr_FTP_Uploading;
//                                  Showmessage('Dest ExtractFileDir ('+Tool_ExtractRelativeWebPath(cftpUp_FilesListDest.Strings[Entry])+') of '+cftpUp_FilesListDest.Strings[Entry]);
                                  edcftp.TransferType   := ftBinary;
                                  edcftp.ChangeDir(Tool_ExtractRelativeWebPath(cftpUp_FilesListDest.Strings[Entry]));
                                  edcftp.TransferType   := ftBinary;
                                  edcftp.Put(cftpUp_FilesListSource.Strings[Entry],ExtractFileName(cftpUp_FilesListDest.Strings[Entry]),false);
                                  cftpUp_StatusList.Strings[Entry]:=  CoStr_FTP_Done;
                                  // pruefen ob datei wirklich korrekt uebertragen wurde fehlt noch
                                  Result:= Result +1//
                              end;
                        end;
                  end;
            end;

      end;
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TF_GC_FTP_UpDown.SingleFTPClient_DefineDServer_DisConnect(SystemTypeNo:integer):boolean;
var
i_ReturnValue,SystemNo,MaxExistingFtpClients:integer;
edcftp   : TIdFTP;
TransferOn:boolean;
begin
    Result := false; // default
    edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo);     // Pointer auf korrekten ftp Client holen
    if (edcftp<>niland (FTP_ClientData[SystemTypeNo].Created) then begin
                if ( FTP_ClientData[SystemTypeNo].Upload_Activ or FTP_ClientData[SystemTypeNo].Download_Activ) then
                    edcftp.Abort;
                edcftp.quit;
                Result := true; // default
                edcftp := nil;
      end else begin // wenn nicht korrekt alles konfiguriert und erstellt wurde  eine Fehlermitteilung machen und fertig


      end;
end;