2016-09-30 2 views
-1

Мне нужна функция на сервере datasnap, который возвращает .zip-файл. Так я начал с:Delphi Datasnap Server Memory Leak с использованием TFileStream как returnvalue

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

Это прекрасно работает, но DataSnap не бесплатно, поэтому я получаю ошибку утечки памяти.

Следующая попытка: Я начал с "TWebModule1.WebModuleAfterDispatch". Я думал, что это может помочь отправить мой ответ с ответом .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-сервер doenst поддерживает TFileStream. Вместо этого я должен использовать TDBXStreamValue, но, похоже, нет рабочего примера ...

Есть ли какой-либо опыт с такой проблемой?

+0

Какой HTML-код написан в конце файла? –

+0

См. [Параметры потока метода сервера DataSnap] (http://community.embarcadero.com/blogs/entry/datasnap-server-method-stream-parameters-31461). –

+0

часть html содержит информацию ответа, такую ​​как код репозиции (пример 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;