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
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; begin Result := -1; edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo); if (edcftp<>nil) and (FTP_ClientData[SystemTypeNo].Created) then begin edcftp.Host := DestIP; edcftp.Port := DestPort; edcftp.Username := DestUserName; edcftp.Password := DestUserPass; edcftp.Passive := false; edcftp.Passive := true; edcftp.TransferType := ftBinary; edcftp.OnAfterClientLogin := SingleFTP_OnAfterClientConnect; edcftp.Intercept := FTPLogEvent; Result := 0; FTP_ClientData[SystemTypeNo].Configured :=true; edcftp := nil; end else begin
end; end; |
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; 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; |
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; edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo); if (edcftp<>nil) and (FTP_ClientData[SystemTypeNo].Created) then begin edcftp.Connect; Result := true; edcftp.quit; edcftp := nil; end else begin
end; end; |
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 SystemNo :=0; if (Sender is TIdFTP) then begin if (SystemTypeNo>0) then begin if ( SingleFTPClient_DoNextUpload(SystemTypeNo,SystemNo)<0) then ShowMessage('Fehler beim Upload auf '+ SenderName+'.'); SingleFTPClient_DefinedServer_DisConnect(SystemTypeNo); end; end; end; |
Die Funktion
SingleFTPClient_DoNextUpload(SystemTypeNo,SystemNo) macht den eigenlich Transfer.
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; edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo); if (edcftp<>nil) then 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; 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; 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; Result:= Result +1; end; end; end; end;
end; end; |
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; edcftp := SingleFTPClient_GetCorrectFTPClient(SystemTypeNo,SystemNo); if (edcftp<>nil) and (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; edcftp := nil; end else begin
end; end; |