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;
我需要 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;