我正在服务器中生成一个PDF文档,然后在客户端中显示。服务器端看起来如下:
ByteArrayOutputStream baos = generatePDF();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=file.pdf");
response.setContentLength(baos.size());
baos.writeTo(response.getOutputStream());
在客户端中,我有以下代码来获取PDF:
$.ajax({
type: "POST",
url: url,
data: {"data": JSON.stringify(myData)},
success: function(data, textStatus, jqXHR) {
window.open("data:application/pdf," + escape(data));
},
error: function(jqXHR) {
showError("...");
}
});
看起来不错,新窗口打开了,但PDF没有显示。它总是显示为空文档。
尽管如此,如果客户端看起来如下,它工作得很好:
var form = $("<form target='_blank'>").attr({
action : myURL,
method : "POST"
});
var input1 = $("<input type='hidden'>").attr({
"name": "data",
value: JSON.stringify(myData)
});
form.append(input1);
$("body").append(form);
form.submit();
form.remove();
但我不能使用第二种方法,因为我需要管理错误,而且我不能使用form.submit().
你知道PDF发生了什么吗?
您可以获得pdf流的base64字符串,并将其传递给响应。
你的方法改变
$.ajax({
type: "POST",
url: url,
data: {"data": JSON.stringify(myData)},
success: function(data, textStatus, jqXHR) {
var pdfWin= window.open("data:application/pdf;base64, " + data, '', 'height=650,width=840');
// some actions with this win, example print...
},
error: function(jqXHR) {
showError("...");
}
});
尝试使用:
dataType: "application/pdf",
success: function(data, textStatus, jqXHR) {
window.open(escape(data), "Title", "");
},
我不能进行异步,但这个js为我返回了附件:
$('<iframe src="url"></iframe>').appendTo('body').hide();
然后浏览器会弹出一个保存/查看弹出窗口,这对我的要求很好;不过没有错误处理。
我认为对于您的服务器端,您可能希望将其作为内联返回,例如response.setHeader("Content-Disposition", "inline; filename=file.pdf");
您将内容长度设置为OK,这可能是成功代码将触发两次,第一次在流的开始,第二次在流结束。
如果你能做到这一点,请告诉我们。