如何在调用 servlet 后使用 ajax 在 iframe 中显示 PDF

Posted

技术标签:

【中文标题】如何在调用 servlet 后使用 ajax 在 iframe 中显示 PDF【英文标题】:How to display a PDF in iframe with ajax after calling a servlet 【发布时间】:2017-05-29 08:14:11 【问题描述】:

当我想在 iframe 中显示 PDF 时遇到问题(使用属性 src)。PDF 永远不会从浏览器中下载。 在某些情况下,我需要使用 ajax 调用在弹出窗口中显示消息。 生成 PDF 的 servlet 代码有效,因为目前我们直接在 iframe 的 src 属性中使用它。

 <iframe src="myServlet" />

但是当我使用带有 ajax 调用的 servlet,并且我想在 iframe 中添加 PDF 的内容时,它不起作用。 我不知道为什么。 这是js的一个例子:

$.ajax(

   url: "myServlet",
   ...
   complete: function(data) 
        var blob = new Blob([data],  type: 'application/pdf' );
        var downloadUrl = URL.createObjectURL(blob);
        $('#myframe').attr("src", downloadUrl);
   
 
);

我尝试使用 chrome,但出现错误: jquery-2.1.3.js?ts=13012017:3 GET data:application/pdf;base64,blob:http://localhost:8180/d21d82b6-8254-4a38-907e-129b3ac037fanet::ERR_INVALID_URL

我可以看到我有一个二进制文件的数据: %PDF-1.4 %���� 3 0 对象 流 x��PU��^A��e�(�...................... ..................... 起始外部参照 38448 %%EOF

对不起,我这里(家里)没有代码,但我认为解释很清楚。 如果我将 ajax 与 iframe 和属性 src 一起使用,我不知道为什么无法下载 PDF。 你有什么想法吗?

谢谢。 弗雷德

【问题讨论】:

【参考方案1】:

这对我有用。

$.ajax(

   url: "myServlet",
   ...
   complete: function(data) 
        $('#myframe').attr('src','data:application/pdf;base64,'+data);
   
 
);

此外,您应该以这种方式编码 ajax ans base64_encode($data)

希望对您有所帮助。

【讨论】:

【参考方案2】:

javascript 中,要对 ajax 答案进行编码,您应该这样做:

var enc = btoa(data)

如果你有问题,你应该试试这个:

var enc = btoa(unescape(encodeURIComponent(data)))

然后

 $('#myframe').attr('src','data:application/pdf;base64,'+ enc);

【讨论】:

以上是关于如何在调用 servlet 后使用 ajax 在 iframe 中显示 PDF的主要内容,如果未能解决你的问题,请参考以下文章

10秒后服务器响应时如何使用ajax发送请求?

ajax上传文件后,后台java如何接收(求后台接收的完整代码)

html页面里的ajax调用servlet,html里没有form表单

在jsp中调用ajax送了一个需下载的文件名给servlet,下载完成文件后需用需返回一个字符串,但是总是出错

如何在 Magnolia Blossom 中进行 AJAX 调用?

第一次后不显示 Ajax 加载屏幕