我有一个可以生成PDF的action类。适当地设置了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));
}
});
上面的代码给出了错误:
您的浏览器发送了此服务器无法识别的请求。
发布于 2010-01-04 21:45:12
为此,您不一定需要Ajax。如果在服务器端代码中将content-disposition
设置为attachment
,那么只需一个<a>
链接就足够了。这样,父页面将保持打开状态,如果这是您主要关心的问题(否则您为什么不必要地选择Ajax呢?)。此外,没有办法同步地很好地处理这个问题。PDF不是字符数据。这是二进制数据。你不能做像$(element).load()
这样的事情。你想为此使用全新的请求。为此,<a href="pdfservlet/filename.pdf">pdf</a>
是非常合适的。
为了帮助您更多地了解服务器端代码,您需要更多地了解所使用的语言,并发布代码尝试的摘录。
发布于 2014-12-19 18:22:32
下面是我是如何让它工作的
$.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();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
使用download.js更新答案
$.ajax({
url: '<URL_TO_FILE>',
success: download.bind(true, "<FILENAME_TO_SAVE_WITH_EXTENSION>", "<FILE_MIME_TYPE>")
});
发布于 2012-02-24 22:01:07
我真的不认为过去的答案中有任何一个发现了原始海报的问题。他们都假设了一个GET请求,而发帖者试图发布数据并获得下载作为响应。
在寻找更好的答案的过程中,我们找到了这个jQuery Plugin for Requesting Ajax-like File Downloads。
在其“核心”中,它创建了一个“临时”HTML表单,其中包含作为输入字段的给定数据。此表单将附加到文档并发布到所需的URL。在此之后,表单再次被删除:
jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
.appendTo('body').submit().remove()
更新Mayur的答案与我提到的jQuery插件相比,看起来非常有希望,也非常简单。
https://stackoverflow.com/questions/1999607
复制相似问题