Мне нужна функция на сервере 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, но, похоже, нет рабочего примера ...
Есть ли какой-либо опыт с такой проблемой?
Какой HTML-код написан в конце файла? –
См. [Параметры потока метода сервера DataSnap] (http://community.embarcadero.com/blogs/entry/datasnap-server-method-stream-parameters-31461). –
часть html содержит информацию ответа, такую как код репозиции (пример 200), тип содержимого и т. Д. – ChessDev