2016-09-30 32 views
-1

我需要一個datasnap-server中的函數,它返回一個.zip文件。 於是我開始用:使用TFileStream作爲返回值的Delphi Datasnap服務器內存泄漏

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

這工作得很好,但的DataSnap不釋放它,所以我得到了內存泄漏錯誤。

下一個嘗試: 我開始於「TWebModule1.WebModuleAfterDispatch」。 我認爲這可以幫助發送我的迴應與「response.SendResponse;」並自行釋放我的流。所以在這裏短版本:

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; 

這幾乎是解決方案,我想,但了DataSnap服務器發送後,我流發送的HTML代碼,這是在文件的結尾寫的。

我知道,datasnap-server支持TFileStream。相反,我應該使用TDBXStreamValue,但似乎沒有工作的例子...

有任何一個expirience與這樣的問題?

+0

在文件末尾寫了什麼HTML? –

+0

請參閱[DataSnap服務器方法流參數](http://community.embarcadero.com/blogs/entry/datasnap-server-method-stream-parameters-31461)。 –

+0

html部分包含響應信息,如reposnse代碼(在示例200中),內容類型等。 – ChessDev

回答

0

謝謝@remy勒博

response.FreeContentStream := true; 

這是解決方案。

我的功能:

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

功能不釋放流!

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;