如何输出要下载的文件而不先将其保存在服务器上?

时间:2013-06-26 06:34:35

标签: html delphi download webbroker

使用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客户端)

1 个答案:

答案 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