jQuery Ajax - 当内容类型为'application / pdf'时显示下载对话框

时间:2014-10-16 22:17:04

标签: jquery ajax

我在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时强制浏览器向用户显示下载对话框?

2 个答案:

答案 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.