мне нужна функция на сервере datasnap, которая возвращает файл .zip. Итак, я начал с:
function TGetData.getZip (): TFileStream;
begin
result := TFileStream.Create('test.zip', fmOpenRead and fmShareDenyWrite);
end
Это отлично работает, но datasnap не освобождает его, поэтому я получаю ошибку утечки памяти.
Следующая попытка: я начал с «TVWebModule1.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 отправляет html-код после того, как мой поток был отправлен, и это написано в конце файла.
Я знаю, что сервер datasnap не поддерживает TFileStream. Вместо этого я должен использовать TDBXStreamValue, но, похоже, нет рабочего примера...
Есть ли у кого-нибудь опыт с такой проблемой?
SendResponse()
уже был вызван, и пытается отправить второй ответ. Что касаетсяTFileStream
, в документации конкретно указано, чтоTFileStream
можно использовать дляContentStream
, так почему вы думаете, что это не поддерживается? Потому что не освобождается? Это будет другой баг. Например, вы уже пробовали установитьresponse.FreeContentStream := true;
? - person Remy Lebeau   schedule 01.10.2016