我有一个 DataSnap 服务器方法
function TServerMethods.GetFile(filename): TStream
返回一个文件。在我的测试用例中,该文件是一个简单的 .PDF。
我确信这个功能可以正常工作,因为我可以在 ObjectiveC 客户端应用程序上打开文件,我使用自己的 http 调用 DataSnap 方法(没有 Delphi 代理)。流从 ASIHttpRequest 对象中读取并保存为本地文件,然后加载并定期显示在标准 pdf 阅读器中。我不知道 ASIHttpRequest 究竟如何管理返回的数据。
但是在我使用标准的 JavaScript 客户端
stream = ServerMethods().GetFile('test.pdf')
JavaScript 函数,由 DataSnap 代理本身提供,我不知道如何向用户显示 .pdf 数据。
使用
window.open().document.write(stream);
一个带有文本原始数据的新浏览器窗口打开( %PDF-1.5 %âãÏÓ 1 0 obj << /Type /Catalog /Pages 2 0 R .....)
和
window.open("data:application/pdf;base64," +stream);
我得到一个空的新浏览器页面。
和
window.open("data:application/pdf," +stream);
或者
document.location = 'data:application/pdf,'+encodeURIComponent(serverMethods().GetFile('test'));
我得到一个带有 pdf empry reader 的新浏览器页面并警告“此 PDF 文档无法正确显示”</p>
没有任何改变添加:
GetInvocationMetadata().ResponseContentType := 'application/pdf';
进入 DataSnap 函数。
我没有其他想法...
编辑
任务是下载一般文件,而不仅仅是 PDF。PDF 只是一个测试。GetFile
必须管理 .pdf、.xlsx、.docx、.png、.eml 等...