使用TFileStream作为返回值的Delphi Datasnap Server内存泄漏

时间:2016-09-30 18:41:51

标签: delphi memory-leaks zip filestream datasnap

我需要一个datasnap-server中的函数,它返回一个.zip文件。 所以我开始:

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-server在我的流发送后发送html代码,这是在文件末尾写的。

我知道,datasnap-server doenst支持TFileStream。相反,我应该使用TDBXStreamValue,但似乎没有工作的例子......

这个问题是否有任何一个问题?

1 个答案:

答案 0 :(得分:0)

谢谢@remy lebeau

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;