我需要一个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,但似乎没有工作的例子......
这个问题是否有任何一个问题?
答案 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;