2016-09-30 2 views
-1

Ich brauche eine Funktion in einem Datasnap-Server, die eine ZIP-Datei zurückgibt. Also begann ich mit:Delphi Datasnap Server Speicherleck mit TFileStream als Rückgabewert

function TGetData.getZip(): TFileStream; 
begin 
    result := TFileStream.Create('test.zip', fmOpenRead and fmShareDenyWrite); 
end 

Dies funktioniert gut, aber DataSnap entbindet es nicht, so dass ich einen Speicherverlust Fehler.

Nächster Versuch: Ich begann bei "TWebModule1.WebModuleAfterDispatch". Ich dachte, es könnte helfen, meine Antwort mit "response.SendResponse;" und befreie meinen Stream auf eigene Faust. Also hier eine kurze Version:

procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
var 
    test : TFileStream; 
begin 
    response.ContentType := 'application/x-zip-compressed'; 
    test := TFileStream.Create('test.zip', fmOpenRead); 
    response.ContentStream := test; 
    response.CustomHeaders.Values['Content-Disposition'] := 'attachment; filename=test12.zip'; 
    response.SendResponse; //Also sendStream didn't help 
    test.Free; 
end; 

Dies ist fast die Lösung, die ich denke, aber der DataSnap-Server sendet die HTML-Code nach meinem Stream gesendet wurde, und dies ist am Ende der Datei geschrieben.

Ich weiß, der Datasnap-Server unterstützt TFileStream. Stattdessen sollte ich TDBXStreamValue verwenden, aber es scheint kein funktionierendes Beispiel zu geben ...

Hat jemand Erfahrung mit solch einem Problem?

+0

Welcher HTML-Code wird am Ende der Datei geschrieben? –

+0

Siehe [DataSnap Server-Methoden-Stream-Parameter] (http://community.embarcadero.com/blogs/entry/datasnap-server-method-stream-parameters-31461). –

+0

Der HTML-Teil enthält die Antwort-Informationen wie Reposse-Code (in Beispiel 200), den Inhaltstyp und so weiter. – ChessDev

Antwort

0

Danke

response.FreeContentStream := true; 

das ist die Lösung lebeau @remy.

Meine Funktion:

function TGetData.articleZippedImages(skip, take: Integer; since: string) : TStream; 

die Funktion nicht den Strom nicht frei!

procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    response.FreeContentStream := true; 
    Response.Content := ''; 
    Response.CustomHeaders.Values['Content-Disposition'] := 'attachment; filename=test.zip'; 
    Response.SendResponse; 
end; 
Verwandte Themen