Delphi 使用 TFileStream 作为返回值的 Datasnap 服务器内存泄漏

Delphi Datasnap Server Memory Leak using TFileStream as returnvalue

我需要 datasnap-server 中的一个函数,returns 一个 .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-code,并且写在文件末尾。

我知道,datasnap-server 不支持 TFileStream。相反,我应该使用 TDBXStreamValue,但似乎没有可用的示例...

有人遇到过这样的问题吗?

谢谢@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;