我在CakePHP项目中使用TCPDF根据用户输入生成PDF文件,并根据输入生成结果。目前,我通过Ajax将用户输入发送到独立的.php
文件。独立的.php
文件根据发送的数据生成PDF文件,然后返回PDF文件,如TCPDF examples page所示。
当我直接访问独立的.php文件(我从浏览器获得下载文件提示)时,一切正常,但是当我通过Ajax尝试时,我无法复制相同的行为。 TCPDF负责设置正确的标头,所以我认为这是我的jQuery的一个问题。以下是我不同但不成功的尝试:
//attempt 1
$.ajax({
url: '/download.php',
type: 'post',
data: { type: 'generate', values: $('#table').html() },
success: function(response) {
console.log(response); //outputs garbled binary data on the browser console
}
});
//attempt 2
$.ajax({
url: '/download.php',
type: 'post',
dataType: 'text',
data: { type: 'generate', values: $('#table').html() },
success: function(response) {
console.log(response); //outputs empty string ""
}
});
//attempt 3
$.ajax({
url: '/download.php',
type: 'post',
dataType: 'text',
contentType: 'application/pdf',
data: { type: 'generate', values: $('#table').html() },
success: function(response) {
console.log(response); //outputs empty string "", same as above. No download dialog.
}
});
//attempt 4
$.ajax({
url: '/download.php',
type: 'post',
contentType: 'application/pdf',
data: { type: 'generate', values: $('#table').html() },
success: function(response) {
console.log(response); //outputs empty string "", same as above. No download dialog.
}
});
如何在使用Ajax时强制浏览器向用户显示下载对话框?
答案 0 :(得分:0)
只有AJAX才能做到这一点 如果您可以通过链接下载文件,只需将页面的位置设置为
即可window.location.href = link;
答案 1 :(得分:0)
我找到了一种非常难看但很方便的方法来实现这一目标。诀窍是创建一个伪表单,将所有需要传递给隐藏input
的pdf生成器文件的变量附加,并通过javascript / jQuery提交。这将确保当前页面状态不受影响,同时还将接收pdf生成器的输出并设置所有正确的标头,从而生成浏览器下载对话框。
对于可能遇到类似问题的人,以下是示例代码:
$('body').append('<form id="generate_pdf" method="post" action="/generate.pdf"></form>');
$('#generate_pdf').append('<input type="hidden" name="values" value="' + val_1 + '">');
$('#generate_pdf').append('<input type="hidden" name="location" value="Mordor">');
$('#generate_pdf').submit();
//as long as generate.pdf has correct headers set, TCPDF will do its thing and a download dialog will be shown by the browser once it returns, all inside the current page.