【发布时间】:2014-09-05 11:46:24
【问题描述】:
我有一个 DataSnap 服务器方法
function TServerMethods.GetFile(filename): TStream
返回一个文件。 在我的测试用例中,该文件是一个简单的 .PDF。
我确信这个功能可以正常工作,因为我能够在 ObjectiveC 客户端应用程序上打开文件,在该应用程序中我使用了我自己的对 DataSnap 方法的 http 调用(没有 Delphi 代理)。 流从 ASIHttpRequest 对象中读取并保存为本地文件,然后加载并定期显示在标准 pdf 阅读器中。 我不知道 ASIHttpRequest 究竟是如何管理返回的数据的。
但是在我使用标准的 JavaScript 客户端
stream = ServerMethods().GetFile('test.pdf')
DataSnap 代理本身提供的 JavaScript 函数,我不知道如何向用户显示 .pdf 数据。
使用
window.open().document.write(stream);
一个新的浏览器窗口打开,其中包含文本原始数据 ( %PDF-1.5 %âãÏÓ 1 0 obj
有
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 文档无法正确显示”
没有任何变化:
GetInvocationMetadata().ResponseContentType := 'application/pdf';
进入 DataSnap 函数。
我没有其他想法...
编辑
任务是下载一般文件,而不仅仅是 PDF。 PDF 只是一个测试。 GetFile 必须管理 .pdf、.xlsx、.docx、.png、.eml 等...
【问题讨论】:
-
有没有办法将资源数据(这里是PDF文档流)与DataSnap中的
http://example.com/resources/mypdf等Web资源地址关联起来?然后window.open('http://example.com/resources/mypdf')应该可以工作。 -
谢谢@mjn。创建服务器端文件资源是一种选择,我会尝试的。我也会尝试从 JavaScript 直接 URL 调用 DataSnap REST 方法,绕过代理。
-
您正在创建什么类型的 REST 服务器?哪个法师? DataSnap REST 服务器应用程序向导中存在一个错误,导致无法覆盖 ResponseContentType。
-
嗨@AndersE.Andersen,我读到了你的answer,我尝试了完整的JavaScript 设计,但没有成功。我已经使用 Delphi XE3,DataSnap Rest 应用程序向导,独立用于调试目的。但是现在有了直接的 URL 请求localhost/datasnap/rest/TserverMethods/GetFile/test.pdf,pdf 最终会被浏览器正确显示。但如果可能的话,我正在寻找一种纯 JavaScript 设计。
-
好吧,那听起来不像是错误导致了这个特定问题。您是否尝试过先调用 document.open("application/pdf") 然后调用 document.write(..pdf-data..) 最后调用 document.close()?
标签: javascript delphi datasnap tstream