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?
Welcher HTML-Code wird am Ende der Datei geschrieben? –
Siehe [DataSnap Server-Methoden-Stream-Parameter] (http://community.embarcadero.com/blogs/entry/datasnap-server-method-stream-parameters-31461). –
Der HTML-Teil enthält die Antwort-Informationen wie Reposse-Code (in Beispiel 200), den Inhaltstyp und so weiter. – ChessDev