使用Delphi XE3,DataSnap / WebBroker,HTML
我创建并加载TStringList
然后将其保存到文件中。我将文件位置放入HTML表单的操作中以强制下载。如何在不保存文件的情况下执行此操作?
MyList := TStringList.Create; (leaving out try/finally, etc.)
MyList.Add() ....
MyList.SaveToFile(MyFullFileName);
MyList.Free;
将此HTML返回WebModuleDefaultHandler
:
<html><head />
<body onload="document.FormOne.submit()">
<form id="FormOne" name="FormOne" method="get"
action="MyFullFileName">
<input type="submit" id="btSubmit1" name="btSubmit1" />
</form>
</body>
</html>
我可以通过某种方式发送MyList
而不先保存吗?
(收件人使用的是标准浏览器,而不是Delphi客户端)
答案 0 :(得分:2)
将其作为内存流...
MyStream:= TMemoryStream.Create;
try
MyList:= TStringList.Create;
try
MyList.Add() ...
MyList.SaveToStream(MyStream);
finally
MyList.Free;
end;
MyStream.Position:= 0;
Response.ContentType:= 'text/html';
Response.ContentStream:= MyStream;
finally
MyStream.Free;
end;
当请求从客户端进入服务器时,您需要将流MyStream
作为响应ContentStream
字段传回。不要忘记在使用它们之前总是将流设置为0!
或者,您也可以使用字符串列表的Text
属性来执行此操作。像这样......
MyList:= TStringList.Create;
try
MyList.Add('<html>');
MyList.Add('<heading/>');
MyList.Add('<body>DataSnap Server</body>');
MyList.Add('</html>');
Response.ContentType:= 'text/plain';
Response.Content:= MyList.Text;
finally
MyList.Free;
end;
当您需要加载/保存/托管原始文件(例如图像)时,通常使用流是最佳选择。绘制到画布,将该画布转换为JPG图像,并将其另存为Stream而不是File,可以非常方便。然后,将其作为Response.ContentStream
传递。因此,我已经习惯使用流,因为它是一种更标准的返回内容的方式。
PS - 如果您希望此文件能够显示为纯文本,请使用ContentType
的{{1}},或者如果您希望将任何类型的文件下载为像text/plain
这样的文件,然后您可以test.txt
使用application/octet-stream
。