我使用 AJAX POST 将表单数据发送到外部脚本,并尝试在提交时隐藏表单并提示用户下载脚本。
脚本本身运行良好(使用 fpdf 输出 pdf 文件以供下载)。出于某种原因,提示用户下载虽然永远不会通过。
我的 Ajax 请求目前是:
$.ajax({
url: "file.php",
type: "POST",
data: data,
cache: false,
success: function (html) {
//hide the form
$('#form').fadeOut('slow');
//display results
$('#form_results').fadeIn('slow');
$("#form_results").html(html);
}
});
文件.php(单独)将使用 FPDF 生成并显示 PDF。通过将输出设置为 I,文档将输出到浏览器,设置为 "D",如果我只是直接访问文件.php它通常会强制下载。
有什么想法吗?
不幸的是,
你不能直接从ajax调用强制下载。最好的办法是通过 ajax 提交表单,并让 ajax 使用一个 url 进行响应,您可以将用户重定向到该 url 以开始下载。但是,仅供参考,使用 location.href 到发送标题以强制下载在 IE 中的页面将导致黄色安全栏出现在页面顶部。这发生在IE8中,不确定其他版本。FF和Chrome没有问题。
编辑:
只是想补充一点,当您将某人重定向到强制下载的页面时,他们实际上并没有离开他们当前所在的页面。因此,他们不必重新加载ajax页面或任何东西。下载对话框将显示。因此,如果您在索引上.php并且您说 location.href='download.php' 并下载.php强制下载。您只需获得下载对话框,不要离开索引.php。
编辑2:
实际上已经有很多关于这个问题的问题。
https://stackoverflow.com/search?q=force+download+over+ajax
问题是你试图显示结果,但它是形式上的,这是隐藏的。尝试类似以下内容:
//hide the form
$('#form').children().fadeOut('slow');
//display results
$('#form results').fadeIn('slow');
$("#form results").html(html);
这样,每个孩子都会被隐藏起来,但父母本身不会。