使用Ajax下载并打开pdf文件
我有一个生成pdf的操作类。 contentType
被适当设置。
public class MyAction extends ActionSupport
{
public String execute() {
...
...
File report = signedPdfExporter.generateReport(xyzData, props);
inputStream = new FileInputStream(report);
contentDisposition = "attachment="" + report.getName() + """;
contentType = "application/pdf";
return SUCCESS;
}
}
我通过Ajax调用来调用这个action
。 我不知道如何将此流传送到浏览器。 我尝试了几件事,但没有成功。
$.ajax({
type: "POST",
url: url,
data: wireIdList,
cache: false,
success: function(response)
{
alert('got response');
window.open(response);
},
error: function (XMLHttpRequest, textStatus, errorThrown)
{
alert('Error occurred while opening fax template'
+ getAjaxErrorString(textStatus, errorThrown));
}
});
以上给出了错误:
您的浏览器发送了此服务器无法理解的请求。
你不一定需要Ajax。 如果您在服务器端代码中将content-disposition
为attachment
,则只需<a>
链接即可。 通过这种方式,父页面将保持打开状态,如果这是您的主要关注点(为什么您不必要地为此选择了Ajax?)。 此外,没有办法很好地处理这个异步。 PDF不是字符数据。 它是二进制数据。 你不能做像$(element).load()
这样的东西。 你想为此使用全新的请求。 为此<a href="pdfservlet/filename.pdf">pdf</a>
是完全合适的。
为了帮助您更好地了解服务器端代码,您需要详细讲述所使用的语言并张贴代码尝试的摘录。
这是我如何得到这个工作
$.ajax({
url: '<URL_TO_FILE>',
success: function(data) {
var blob=new Blob([data]);
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="<FILENAME_TO_SAVE_WITH_EXTENSION>";
link.click();
}
});
我并不认为过去的答案都能找出原始海报的问题。 他们都假设一个GET请求,而海报试图发布数据并获得响应下载。
在寻找更好的答案的过程中,我们发现了这个用于请求类似Ajax的文件下载的jQuery插件。
在其“心脏”中,它创建一个包含给定数据的“临时”HTML表单作为输入字段。 此表单被附加到文档并发布到所需的URL。 在此之后,表单又被删除:
jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
.appendTo('body').submit().remove()
更新 Mayur的答案看起来相当有前途,并且与我提到的jQuery插件相比非常简单。
链接地址: http://www.djcxy.com/p/36445.html