Hallo zusammen,
ich habe etwas Probleme mit dem TrivialFtp von
Indy. Im Prinzip möchte ich vom Client aus einfach eine Datei herunterladen. Im Client habe ich das Ganze auf einen Button gelegt, wobei FtpClient halt die TIdTrivialFTP-Komponente ist:
Delphi-Quellcode:
try
FtpClient.Connect;
St:=TFileStream.Create(Datapath+'daten.txt',fmCreate);
FtpClient.Get('daten.txt',ST);
finally
if Assigned(ST) then
FreeAndNil(ST);
if FtpClient.Connected then
FtpClient.Disconnect;
end;
Im Serverprogramm gibt es ein FtpServer vom Typ TIdTrivialFtpServer mit den beiden nachfolgenden Events:
Delphi-Quellcode:
procedure TFormMain.FtpServerReadFile(Sender: TObject;
var FileName: String; const PeerInfo: TPeerInfo;
var GrantAccess: Boolean; var AStream: TStream;
var FreeStreamOnComplete: Boolean);
var FS:TFileStream;
begin
FreeStreamOnComplete:=TRUE;
try
// Verzeichnis umleiten auf das Datenverzeichnis, kein anderes Verzeichnis akzeptieren
Filename:=Datapath+ExtractFilename(Filename);
if FileExists(Filename) then
begin
FS:=TFileStream.Create(Filename,fmOpenRead or fmShareExclusive);
AStream:=FS;
GrantAccess:=TRUE;
end
else GrantAccess:=FALSE;
except
GrantAccess:=FALSE;
if Assigned(FS) then
FreeAndNil(FS);
end;
end;
procedure TFormMain.FtpServerTransferComplete(Sender: TObject;
const Success: Boolean; const PeerInfo: TPeerInfo; var AStream: TStream;
const WriteOperation: Boolean);
begin
try
if Assigned(AStream) then
FreeAndNil(AStream);
except
end;
end;
Das Problem: im Client komme ich aus dem Get nicht wieder und laufe dann auf ein Timeout. Das Connect geht problemlos klar.
Ich habe dann auf der Serverseite den Debugger laufen lassen. Die Dateianfrage kommt dort an, die Datei wird gefunden und die vom Stream angegebene Dateigröße stimmt mit 30417 Byte auch. Auch das TransferComplete-Event auf der Serverseite wird aufgerufen. Daher gehe ich davon aus, dass auf dem Server alles glatt geht - nur im Client kommt halt nichts an.
Hat jemand eine Idee, wo ich noch suchen kann oder was ich falsch mache?
Gruß
easy