1

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

4

1 回答 1

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 图像并将其保存为流而不是文件会非常方便。然后,将其作为Response.ContentStream. 因此,我已经更习惯于使用流,因为它是一种更标准的返回内容的方式。

PS - 如果您希望此文件能够显示为纯文本,则使用ContentTypetext/plain或者如果您希望将任何类型的文件作为文件下载,test.txt则可以使用application/octet-streamfor ContentType

于 2013-06-26T07:09:45.990 回答