![]() |
Datei Download mit Datasnap
Hallo,
ich habe einen Datei Download mit Datasnap implementiert (über Streams wie es hier auch schon mal diskutiert worden ist). Das hat bisher auch ganz gut funktioniert, aber inzwischen gibt es häufiger Probleme beim Download. Es tritt keine Exception auf, aber der Download bleibt stehen (beim lStream.Read) und das Client-Programm lässt sich nur noch über den Taskmanager beenden. Ich vermute, dass es damit zu tun hat, dass mehrere Clients gleichzeitig die gleiche Datei herunterladen wollen. Auf dem Server die folgende Methode aufgerufen:
Delphi-Quellcode:
Auf den Clients sieht das so aus:
function TServerMethodsS.DownloadFile(const strPfad, FileName: String): TStream;
begin if DirectoryExists(strPfad) and FileExists(strPfad + FileName) then Result := TFileStream.Create(strPfad + FileName, fmOpenRead or fmShareDenyNone) else Result := Nil; end;
Delphi-Quellcode:
Ich verwende Delphi XE2 Update 4 Hotfix 1, einen TDSServer und Lifecycle=Session. Die Download Dateien sind ca. 20-40 MB gross. Momentan greifen maximal 2-3 Clients gleichzeitig auf die gleiche Datei zum Download zu.
procedure DownloadFile(PfadName, FileName: String);
var lFileStream: TFileStream; lStream : TStream; Buffer : array [1..CBufSize] of Byte; BytesRCount: Integer; begin try lFileStream := TFileStream.Create(FileName, fmCreate); lStream := DownloadFile(PfadName, FileName); if Assigned(lFileStream) and Assigned(lStream) then try repeat BytesRCount := lStream.Read(Buffer, SizeOf(Buffer)); if BytesRCount > 0 then lFileStream.WriteBuffer(Buffer, BytesRCount); until (BytesRCount < SizeOf(Buffer)); finally lFileStream.Free; end; except ShowMessage('Fehler beim Download'); end; Hat jemand eine Idee, wo das Problem liegen könnte? Gibt es Einstellungen auf dem Server, mit denen ich das Problem evtl. lösen könnte? Und ist es generell eine gute Idee, so einen Download über Datasnap zu machen? Oder besser über FTP (Indy) oder etwas ganz anderes? |
AW: Datei Download mit Datasnap
Das ist nicht dein realer Code!
|
AW: Datei Download mit Datasnap
Ich habe den Code auf das Wesentliche gekürzt (dass die Routine Downloadfile auf der Client-Seite über eine aus einer dll exportierte Funktion die Server-Methode Downloadfile aufruft, habe ich weggelassen), aber ansonsten ist der Code so, wie er bei mir im Programm steht.
Oder bezog sich deine Antwort auf einen anderen Punkt? |
AW: Datei Download mit Datasnap
Ich hoffe doch mal auch nicht. 3 Fehler in einer Zeile.
Delphi-Quellcode:
BytesRCount := lStream.Read(Buffer, SizeOf(Buffer));
|
AW: Datei Download mit Datasnap
Könntest du mir bitte auf die Sprünge helfen, welche drei Fehler du da siehst?
Ich hatte mich mit dieser Routine an dem Thread ![]() Der Code lässt sich auch kompilieren und lief bis vor Kurzem ohne Probleme. |
AW: Datei Download mit Datasnap
Zitat:
Zitat:
Delphi-Quellcode:
Hier wird die aktuelle Prozedur rekursiv als Funktion aufgerufen. Das sollte der Compiler anmeckern. Das kann also nicht der reale Code sein. Solange du aber eine Art Zensur bei deinem Code vornimmst, kann man nicht mehr sagen, wo das wirkliche Problem liegen könnte. lStream := DownloadFile(PfadName, FileName); Ich glaube dir ja, daß du nur das weglässt, von dem du glaubst, daß es nicht relevant ist. Aber da du nicht weißt, was das Problem verursacht, kannst du nicht wissen, was relevant ist. |
AW: Datei Download mit Datasnap
Mit den guten TCPIP Komponenten habe ich auch so manchmal meine Probleme:
ich habe es über den IOHandler direkt gelöst und hier auch größere Dateien immer problemlos und schnell übertragen können. ist mal ein anderer Ansatz :
Code:
procedure TFM_Haupt.IdTCPServer1Execute(AContext: TIdContext);
var jpg : TJpegImage; FStream: TMemoryStream; begin FStream := TMemoryStream.Create; jpg := TJpegImage.Create; try FM_Haupt.RE_LOG.Lines.Add('Bild ist gekommen'); AContext.connection.IOHandler.ReadStream(FStream); FStream.Position := 0; jpg.LoadFromStream(FStream); jpg.SaveToFile('test.jpg'); Image1.Picture.LoadFromFile('test.jpg'); finally AContext.connection.Disconnect; end; FreeAndNil(FStream); Image1.Top:=1; end; |
AW: Datei Download mit Datasnap
Hallo Uwe,
du hast recht, da habe ich etwas zu viel gekürzt. Es sollte beim Client eigentlich
Delphi-Quellcode:
heißen, wobei diese Funktion wie beschrieben aus einer Dll kommt:
lStream := DownloadFileL(PfadName, FileName);
Delphi-Quellcode:
In der Dll schaut die Funktion wie folgt aus:
function DownloadFileL(PfadName: string; FileName: string): TStream; external 'DSnapClient.dll';
Delphi-Quellcode:
und ConvertDataModule kapselt einfach die ClientServermethoden des Datasnap-Servers:
function DownloadFileL(PfadName: string; FileName: string): TStream;
begin if Assigned(ConvertDataModule) then Result := ConvertDataModule.ServerMethodsClient.DownloadFile(PfadName, FileName) else Result := Nil; end;
Delphi-Quellcode:
TConvertDataModule = class(TDataModule) DSnapSERVER: TSQLConnection; private FServerMethodsClient: TServerMethodsClient; ... public property ServerMethodsClient: TServerMethodsClient read GetServerMethodsClient write FServerMethodsClient; ... |
AW: Datei Download mit Datasnap
Hallo arnof,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz